2011-05-13 3 views
1

Android가 처음입니다. 다운로드 한이 클래스를 사용하려고합니다.ERROR/AndroidRuntime (29693) : 원인 : java.lang.RuntimeException : Looper.prepare()를 호출하지 않은 스레드에서 핸들러를 만들 수 없습니다.

public class BatchImageDownloader extends AsyncTask<Void, Void, Void> { 

List<String> imgUrls = new ArrayList<String>(); 
BaseAdapter adapter; 
HashMap<String, Drawable> imageCache; 
Context ctxt; 

public BatchImageDownloader(BaseAdapter adapter, HashMap<String, Drawable> imageCache, Context ctxt) { 
    this.adapter = adapter; 
    this.imageCache = imageCache; 
    this.ctxt = ctxt; 
} 

public void addUrl(String url) { 
    imgUrls.add(url); 
    Log.i("imgDownloader", "url ADDED!"); 
} 

@Override 
protected Void doInBackground(Void... params) { 
    for (String url : imgUrls) { 
     if (!imageCache.containsKey(url)) { 
      Drawable bm = downloadImage(url); 
      if (null != bm) { 
       imageCache.put(url, bm); 
       publishProgress(); 
      } 
     } 
    } 
    return null; 
} 

@Override 
protected void onProgressUpdate(Void... values) { 
    adapter.notifyDataSetChanged(); 
} 

@Override 
protected void onPostExecute(Void result) { 
    adapter.notifyDataSetChanged(); 
} 

public Drawable downloadImage(String url) { 

    DefaultHttpClient httpClient = new DefaultHttpClient(); 
    HttpGet request = new HttpGet(url); 
    try {   
     HttpResponse response = httpClient.execute(request); 
     InputStream stream = response.getEntity().getContent(); 
     Drawable drawable = Drawable.createFromStream(stream, "src"); 
     //Log.i("imgDownloader", "image DOWNLOADED!"); 
     //int duration = Toast.LENGTH_LONG; 
     //Toast.makeText(ctxt, "Inizio scaricamento", duration).show(); 
     return drawable; 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
     return null; 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
     return null; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } catch (NullPointerException e){ 
     e.printStackTrace(); 
     return null;    
    } 

} 

} 

글쎄, 내가 실행하려고 할 때 : batchDownloader.execute(); 나는 이것을 얻는다 :

05-13 16:13:22.750: ERROR/AndroidRuntime(29693): FATAL EXCEPTION: AsyncTask #1 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693): java.lang.RuntimeException: An error occured while executing doInBackground() 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at java.lang.Thread.run(Thread.java:1096) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at android.os.Handler.<init>(Handler.java:121) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at android.widget.Toast.<init>(Toast.java:68) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at android.widget.Toast.makeText(Toast.java:231) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at com.apps.EveryEyeFeedReader.BatchImageDownloader.downloadImage(BatchImageDownloader.java:73) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at com.apps.EveryEyeFeedReader.BatchImageDownloader.doInBackground(BatchImageDownloader.java:43) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at com.apps.EveryEyeFeedReader.BatchImageDownloader.doInBackground(BatchImageDownloader.java:1) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
05-13 16:13:22.750: ERROR/AndroidRuntime(29693):  ... 4 more 

누구든지 나를 도울 수 있습니까? Thx

답변

0

doInBackground() 메서드에서 UI와 상호 작용할 수 없으며 UI 논리를 onPostExecute()으로 옮깁니다. 그래서 (아마) Toast 행을 주석 처리해야합니다. 귀하의 예외

+0

"UI 로직을 onPostExecute()"로 옮길 때 의도 한 바는 무엇입니까? 잘못된 지침이있는 지침은 무엇입니까? 이 멍청한 질문에 사과드립니다. – Nemus

0

는 토스트와 관련된 뭔가

주석이 그 UI, 그것은 UIThread 그래서

입니다 만질 수있는 유일한 스레드 내가 u는 뭔가를해야한다고 생각와 관계가 아무것도 같은 :

Ctx.runOnUIThread(new Runnable() 
{@override 
public void run(){ Toast.makeText(.............).show(); 
} 
}); 

는 도움이되기를 바랍니다 :)

0

그가 의미 변경하거나 modifica와 관계가있는 모든 지침, 그 UI 구성 요소를 사용하려면 onPostExecute()

메서드에 넣어야하므로 doInBackground (...) 메서드에서 예제 Toast.show()를 호출하지 마십시오.

관련 문제