Android AsyncTask在死线程

时间:2016-10-29 21:18:06

标签: java android json multithreading android-asynctask

我正在尝试创建一个类似于目录的程序 - 我有一个JSON数组,我循环并将JSON对象解析为包含图像链接的字符串,以及两个字符串,用于描述每个对象。现在,当使用链接从互联网下载图像时,我每次都遇到同一图像的问题,图像编号为93.我检查了链接,它正在工作,与其他链接一样。 发生这种情况:

 W/MessageQueue: Handler (android.os.Handler) {f95f6fe} sending message to a Handler on a dead thread
 java.lang.IllegalStateException: Handler (android.os.Handler) {f95f6fe} sending message to a Handler on a dead thread
     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543)
     at android.os.Handler.enqueueMessage(Handler.java:643)
     at android.os.Handler.sendMessageAtTime(Handler.java:612)
     at android.os.Handler.sendMessageDelayed(Handler.java:582)
     at android.os.Handler.post(Handler.java:338)
     at android.os.ResultReceiver$MyResultReceiver.send(ResultReceiver.java:57)
     at com.android.internal.os.IResultReceiver$Stub.onTransact(IResultReceiver.java:58)
     at android.os.Binder.execTransact(Binder.java:565)

这就是我的AsyncTask看起来的样子:

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;

    public DownloadImageTask(ImageView bmImage) {
        this.bmImage = bmImage;
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon11 = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mIcon11 = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mIcon11;
    }

    protected void onPostExecute(Bitmap result) {
        bmImage.setImageBitmap(result);
    }
}

这就是我调用AsyncTask的方式:

 new DownloadImageTask(imgProductPicture).execute(pictureLink);
  layoutTest.addView(NewImgView);

在我的代码中,我确保一次调用不超过5个,并且在到达索引为92的对象之前它们都会毫无问题地加载。对象本身很好,但应用程序此时关闭。有谁知道为什么?我尝试一次下载较少的图像(逐个),但仍然在同一点上失败。我很感激任何帮助。

2 个答案:

答案 0 :(得分:0)

AsyncTask使用主线程的处理程序来回调onPostExecute()。如果主线程在回调时死机,系统会抛出异常。为避免这种情况,您必须保持主线程处于活动状态,直到所有工作完成。

答案 1 :(得分:0)

我通过每次调用DownloadImageTask时创建一个新的处理程序/ runnable来解决问题。感谢所有试图提供帮助的人。