在AsyncTask的doInBackground中出现android.os.NetworkOnMainThreadException异常

7

为什么我在一个应该使用android.os.NetworkOnMainThreadException的AsyncTask中遇到了这个问题?我认为AsyncTask是解决这个问题的方法。异常在第7行。

private class ImageDownloadTask extends AsyncTask<String, Integer, byte[]> {
    @Override
    protected byte[] doInBackground(String... params) {
        try {
            URL url = new URL(params[0]);
            URLConnection connection = url.openConnection();
            InputStream inputStream = connection.getInputStream();
            ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
            int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];

            int len;
            while ((len = inputStream.read(buffer)) != -1) {
                byteBuffer.write(buffer, 0, len);
            }
            return byteBuffer.toByteArray();
        } catch (IOException ex) {
            return new byte[0];
        }
    }
}

我想用它来下载图片。
public byte[] getProfilePicture(Context context, String id) {
    String url = context.getString(R.string.facebook_picture_url_large, id);
    ImageDownloadTask task = new ImageDownloadTask();
    return task.doInBackground(url);
}

5
请添加调用AsyncTask的代码。 - ianhanniballake
可能是android.os.NetworkOnMainThreadException的重复问题。 - njzk2
没有重复,因为所有的帖子都是关于那些没有使用异步任务但我已经使用了异步任务并且仍然遇到异常的人。 - Sven Mäurer
你需要在AsyncTask上调用.execute()方法,以便它能够在后台工作。https://developer.android.com/reference/android/os/AsyncTask.html - michaelcarrano
2个回答

16

如果您直接调用 doInBackground(),实际上并没有使用 AsyncTask 功能。相反,应该调用 execute() 方法,然后通过重写 AsyncTask 的 onPostExecute() 方法来使用结果,如同该页面的 Usage 部分所解释的那样。


1
最佳下载图像并将其附加到ImageView的方法是将ImageView作为参数传递给异步任务,并将URL设置为图像视图的标记,然后在OnPostExecute()中设置图像到ImageView。请参考以下示例:
public class DownloadImagesTask extends AsyncTask<ImageView, Void, Bitmap> {

ImageView imageView = null;

@Override
protected Bitmap doInBackground(ImageView... imageViews) {
    this.imageView = imageViews[0];
    return download_Image((String)imageView.getTag());
}

@Override
protected void onPostExecute(Bitmap result) {
    imageView.setImageBitmap(result);
}


private Bitmap download_Image(String url) {
    ...
}

"而且使用方法将是这样的"
ImageView mChart = (ImageView) findViewById(R.id.imageview);
String URL = "http://www...someImageUrl ...";

mChart.setTag(URL);
new DownloadImageTask.execute(mChart);

完成后,图像将自动附加。为了更好地进行内存优化,您可以使用WeakReference

祝好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接