在android中使用asynctask为RecyclerView下载图像

这是我的以下AsyncTask类代码,用于下载RecyclerView图像。

 public class MyDownloadImageAsyncTask extends AsyncTask { private final WeakReference imageViewReference; public MyDownloadImageAsyncTask(ImageView imv) { imageViewReference = new WeakReference(imv); } @Override protected Bitmap doInBackground(String... urls) { Bitmap bitmap = null; for (String url : urls) { bitmap = MyUtility.downloadImage(url); /*if (bitmap != null) { mImgMemoryCache.put(url, bitmap); }*/ } return bitmap; } protected void onPostExecute(Bitmap bitmap){ if (imageViewReference != null && bitmap != null) { final ImageView imageView = imageViewReference.get(); if (imageView != null) { imageView.setImageBitmap(bitmap); } } } } 

我这样调用我的AdapterAsyncTask

 MyDownloadImageAsyncTask task = new MyDownloadImageAsyncTask(holder.vIcon); task.execute(new String[] {(String)movie.get("image")});); 

每次运行时应用程序都会崩溃。 下载图像的URL位于ArrayList

我想我在调用AsyncTask犯了这个错误,但我无法弄清楚解决方案。

改变这个

  public MyDownloadImageAsyncTask(ImageView imv) { imageViewReference = new WeakReference(imv); } 

对此

 public MyDownloadImageAsyncTask(ImageView imv) { imageViewReference = new WeakReference(imv); } 

这是我使用的代码,它完美无缺

 class LoadImage extends AsyncTask { private final WeakReference imageViewReference; public LoadImage(ImageView imageView) { imageViewReference = new WeakReference(imageView); } @Override protected Bitmap doInBackground(String... params) { try { return downloadBitmap(params[0]); } catch (Exception e) { // log error } return null; } @Override protected void onPostExecute(Bitmap bitmap) { if (isCancelled()) { bitmap = null; } if (imageViewReference != null) { ImageView imageView = imageViewReference.get(); if (imageView != null) { if (bitmap != null) { imageView.setImageBitmap(bitmap); } else { Drawable placeholder = imageView.getContext().getResources().getDrawable(R.drawable.ic_launcher); imageView.setImageDrawable(placeholder); } } } } private Bitmap downloadBitmap(String url) { HttpURLConnection urlConnection = null; try { URL uri = new URL(url); urlConnection = (HttpURLConnection) uri.openConnection(); int statusCode = urlConnection.getResponseCode(); if (statusCode != HttpStatus.SC_OK) { return null; } InputStream inputStream = urlConnection.getInputStream(); if (inputStream != null) { Bitmap bitmap = BitmapFactory.decodeStream(inputStream); return bitmap; } } catch (Exception e) { urlConnection.disconnect(); Log.w("ImageDownloader", "Error downloading image from " + url); } finally { if (urlConnection != null) { urlConnection.disconnect(); } } return null; } 

}

以下是我从我的ADAPTER调用它的方式

 new LoadImage(holder.itemImage).execute(IMAGE_URL); 

单独为每个URL。

试试这个,如果它可以帮助你。