2013-10-17 1 views
2

여기 몇 가지 답변을 살펴 봤지만 모두 다른 것들을 묻습니다. 결과적으로 아래 코드를 작성했습니다. AsyncTask를 사용하여 JSON을 구문 분석하면 두 곳에서 액세스 할 수 있습니다. doInBackground()의 끝; 및 onPostExecute(); JSON 구문 분석에서 가져온 URL의 이미지 뷰로 이미지를로드하는 방법은 무엇입니까?

나는 모두에 다음 코드를 시도하고 두 개의 서로 다른 오류를 가지고 :

코드 :

try { 
    ImageView one = (ImageView)findViewById(R.id.one); 
    String getImage = bookDet.get(0).image; 
    Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(getImage).getContent()); 
    one.setImageBitmap(bitmap); 
} catch (MalformedURLException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

BookDet가 문자열로 변환이 넣어 된 데이터를 보유하고있는 ArrayList에있다 .

나는 그것이) (doInBackground 시도 오류 : 만의 일부하지만 마지막 줄 열쇠가 될 것으로 보인다

E/AndroidRuntime(14007): FATAL EXCEPTION: AsyncTask #2 
E/AndroidRuntime(14007): java.lang.RuntimeException: An error occured while executing doInBackground() 
E/AndroidRuntime(14007): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
E/AndroidRuntime(14007): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
E/AndroidRuntime(14007): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
E/AndroidRuntime(14007): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
E/AndroidRuntime(14007): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
E/AndroidRuntime(14007): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
E/AndroidRuntime(14007): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
E/AndroidRuntime(14007): at java.lang.Thread.run(Thread.java:856) 
E/AndroidRuntime(14007): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

. 그래, 단 하나의 AsyncTask가있다. 내가 onPostExecute에서 할

오류 :

E/AndroidRuntime(16801): FATAL EXCEPTION: main 
E/AndroidRuntime(16801): android.os.NetworkOnMainThreadException 
E/AndroidRuntime(16801): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
E/AndroidRuntime(16801): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
E/AndroidRuntime(16801): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
E/AndroidRuntime(16801): at java.net.InetAddress.getAllByName(InetAddress.java:214) 
E/AndroidRuntime(16801): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 
E/AndroidRuntime(16801): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
E/AndroidRuntime(16801): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 
E/AndroidRuntime(16801): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
E/AndroidRuntime(16801): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
E/AndroidRuntime(16801): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316) 
E/AndroidRuntime(16801): at libcore.net.http.HttpEngine.connect(HttpEngine.java:311) 
E/AndroidRuntime(16801): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 
E/AndroidRuntime(16801): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 
E/AndroidRuntime(16801): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81) 
E/AndroidRuntime(16801): at java.net.URLConnection.getContent(URLConnection.java:190) 
E/AndroidRuntime(16801): at java.net.URL.getContent(URL.java:447) 

그래서 메인 스레드에서 그것을 할 수 없어 ...?

지금 내가 할 수있는 최선의 방법은 해당 URL을 문자열로 가져오고 그 텍스트가 잘 보이는 TextView를 사용하는 것입니다.하지만 그건 분명히 쓸모가 없습니다.

아이디어가 있으십니까? 비동기 적으로 수행 된 파싱 된 데이터 세트에서 이미지가 나타나게하려면 어떻게해야합니까?

아무도 알아보세요. 감사.

답변

4

Android Query와 같은 다른 방법을 사용하는 것이 좋습니다.

현재 위치에서 해당 jar 파일을 다운로드 할 수 있습니다 http://code.google.com/p/android-query/downloads/list

AQuery androidAQuery=new AQuery(this); 

를 예를 들어 :

androidAQuery.id(YOUR IMAGEVIEW).image(YOUR IMAGE TO LOAD, true, true, getDeviceWidth(), ANY DEFAULT IMAGE YOU WANT TO SHOW); 

직접 URL을 통해 이미지를 표시 할 수 있습니다 위의 코드를 사용하여.

androidAQuery.ajax(YOUR IMAGE URL,Bitmap.class,0,new AjaxCallback<Bitmap>(){ 
         @Override 
         public void callback(String url, Bitmap object, AjaxStatus status) { 
          super.callback(url, object, status); 

          //You will get Bitmap from object. 
         } 

}); 

이 라이브러리는 안드로이드 자체에 의해 제공됩니다, 그래서 그것을 사용하고 당신이 원하는 결과를 볼 : 이제 코드 아래 URL에서 직접 비트 맵을 얻는 것입니다.

매우 빠르고 정확하며 로딩 할 때 애니메이션과 같은 더 많은 기능을 찾을 수 있습니다. 필요한 경우 비트 맵 가져 오기;

+0

그럼 이제 내 onPostExecute에서이 문제를 해결할 수 있으며 작동할까요? Image URL을 모른다. JSON에서 호출 한 문자열에있다. –

+0

onPostExecute()에서 이것을 호출 할 필요가 없습니다. Json의 yur image URL을 가져 와서 Android Query에 전달하면됩니다. 이미지를 다운로드하고 표시합니다. –

+0

잠깐, 이해가 안되네. onPostExecute에서 나머지 JSON 데이터를 TextViews에 저장합니다. 그것은 내 AsyncTask 어딘가에 있어야합니다. 왜냐하면 thats는 내가 문자열의 형태로 imageurl에 액세스 할 수있는 유일한 장소이기 때문입니다. –

0

파일을 비동기 적으로 가져와 이미지 뷰로 설정해야합니다.

나는 비동기 HTTP 호출을 만들기위한 모든 작업을 쉽게하기 위해이 가벼운 라이브러리를 많이 사용했다 : http://loopj.com/android-async-http/.

예 :

imageView = (ImageView) view.findViewById(R.id.YOUR_IMAGEVIEW_ID); 

는 희망이 도움 : 이미지 뷰가 이전에 가지고 귀하의 이미지 뷰의 참조입니다

AsyncHttpClient client = new AsyncHttpClient(); 
String[] allowedContentTypes = new String[] { "image/png", "image/jpeg" }; 
client.get("http://example.com/file.png", new BinaryHttpResponseHandler(allowedContentTypes) { 
    @Override 
    public void onSuccess(byte[] fileData) 
    { 
     Bitmap bmp = BitmapFactory.decodeByteArray(fileData, 0, fileData.length); 

     if(imageView != null) 
     { 
      imageView.setImageBitmap(bmp); 
     } 
    } 
}); 

.

+0

라이브러리가 없으면 어떻게 할 수 있습니까? 그것의 요지가 뭐야? 다른 AsyncTask를 다른 AsyncTask에서 시작하고 데이터를 다시 가져 오지 만 이미지 URL 만 가져 오거나 다른 하나의 onPostExecute를 통해 가져올 수 있습니까? –

+0

물론 여기에는 1 분의 통합과 매우 적은 코드 행이 있습니다.이 라이브러리는 Instagram과 Pinterest가 사용하는 매우 안정적이고 강력한 솔루션입니다. 그렇다면 비동기 HTTP 호출을 수행해야하는 앱에서 이것이 유일한 곳이라면 라이브러리 통합을 원하지 않는다는 것을 이해할 수 있습니다. 그렇다면 여기에 설명 된 AsyncTask를 사용하십시오. http : // stackoverflow .com/questions/13085951/asynctask-imageview-from-image-web-using-setimagebitmap – fasteque

+0

멋지다, 나는 그것을 주겠다. 그 중 하나는 URL을 이미 가지고 있고 나는 함께 데이터의 덩어리를 파싱하기 전까지는 내 것을 얻지 못할 것이다. 잘하면 그것은 여전히 ​​작동하고 위와 같은 오류가 발생하지 않습니다. 실제로 그것을 보면, 나는 그것이 효과가 있다고 생각하지 않습니다. –

0

이미지를 doBackground()에서 다운로드 한 다음 doBackground의 결과를 방금 다운로드 한 비트 맵으로 설정해야합니다. onPostExecute (비트 맵 bmp)에서 원하는 imageView로 설정할 수 있습니다. AsyncTask의 매개 변수를 변경하는 것을 잊지 마십시오.

AsyncTask<SomeObject, Integer, Bitmap> 

코드는 다음과 같아야합니다. URL에서

ImageView one = (ImageView)findViewById(R.id.one); 
String getImage = bookDet.get(0).image; 
$.with(one).image(getImage); 

이 의지 게으른로드 이미지를, 모든 비동기 호출 및 데이터 분석 처리 :

public class DownloadFilesTask extends AsyncTask<SomeObject, Integer, Bitmap> { 
    protected Long doInBackground(SomeObject object) { 

     //do the networking and parse json here 

     try { 
      String getImage = bookDet.get(0).image; 
      Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(getImage).getContent()); 
      return bitmap; 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    protected void onPostExecute(Bitmap bmp) { 

     //set the bitmap to image here 

     ImageView one = (ImageView)findViewById(R.id.one); 
     one.setImageBitmap(bmp); 
    } 
} 
+0

내 현재 AsyncTask는 다음과 같습니다 : public class HttpTask extends AsyncTask 새 것으로 시작 하시겠습니까? –

+0

첫 번째 스팟 (첫 번째 보이드)은 doBackgorund()의 입력 매개 변수를위한 스팟이고 두 번째 스팟은 진행 변경을위한 스팟이고 세 번째 스팟은 onBackgroud 아웃풋과 onPostExecute 인풋을위한 스팟이다. 따라서 새로운 AsycTask를 생성하고이 상황을 위해 이것을 시작할 수 있습니다. aech 상황에 대해 서로 다른 AssyncTask를 가질 수 있습니다. – Alex

+0

고마워요.하지만 한 줄의 코드 만 추가하면되기 때문에 아래 답변이 더 쉽습니다. 작은 Google 제공 라이브러리를 사용하여 도망 갈 수 있다고 생각합니다. 나는 이걸로 내 코드를 두 배로했을 텐데. 이 유형의 물건에는 전혀 새로운 AsyncTask가 필요하지만 그 이유는 분명합니다. –

0

당신은 크게이 문제를 단순화하기 위해 droidQuery를 사용할 수 있습니다.

관련 문제