2011-05-13 2 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(), переместите логику пользовательского интерфейса на onPostExecute(). Вот почему (предположительно) вам пришлось прокомментировать строки Toast.

+0

Что вы намерены, когда говорите «переместите логику пользовательского интерфейса на onPostExecute()»? Какие инструкции находятся в неправильном месте? Извините за этот вопрос noob .. – Nemus

0

в вашем исключением, есть что-то связано с Toast,

примечание, что если что имеет отношение с UI, только кто нить может коснуться это UIThread

, так что я думаю, что и должны делать что-то как это:

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

надеюсь, что это помогает :)

0

он означает, что любые инструкции, который имеет отношение с изменением или modifica вы должны поместить его в метод onPostExecute()

поэтому не вызывайте пример Toast.show() в вашем методе doInBackground (...);

Смежные вопросы

 Смежные вопросы