ОШИБКА / AndroidRuntime (29693): Причина: java.lang.RuntimeException: Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare () - PullRequest
1 голос
/ 13 мая 2011

Я новичок в Android. я пытаюсь использовать этот класс, который я скачал.

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

Ответы [ 3 ]

0 голосов
/ 13 мая 2011

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

обратите внимание, что anyThing, имеющие отношение к пользовательскому интерфейсу, единственный поток, который может к нему прикоснуться, это UIThread

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

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

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

0 голосов
/ 13 мая 2011

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

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

0 голосов
/ 13 мая 2011

Вы не можете взаимодействовать с пользовательским интерфейсом в методе doInBackground(), переместите логику пользовательского интерфейса в onPostExecute(). Вот почему (предположительно) вам пришлось закомментировать строки Toast.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...