2011-05-13 73 views
1

我是Android新手。 我正在嘗試使用我下載的這個類。錯誤/ 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()」時,你打算做什麼? 哪些說明在錯誤的地方? 對不起這個noob問題.. – Nemus 2011-05-13 15:21:32

0
在你的異常

,有一些相關的吐司,

注意,任何事情都具有UI,誰可以觸摸它是UIThread

所以唯一的線程我覺得你應該做的事情關係像這樣:

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

希望它能幫助:)

0

他的意思是,它有一個關係不斷變化或modifica任何指示你應該把它放在方法onPostExecute()

所以不要在你的方法doInBackground(...)中調用Toast.show()方法。

相關問題