我让AsyncTask为我的RecyclerView加载图像。它有方法downloadImage(),我每次在ViewHolder调用它。那么对于每个图像,它应该创建新的AsyncTask?我无法弄清楚它是并行还是顺序下载。 (我不能使用库,所有都必须自定义)
private static class DownloadImage extends AsyncTask<String, Void, Bitmap> {
private ImageView mBitmapImage;
DownloadImage(ImageView imageView) {
mBitmapImage = imageView;
}
@Override
protected Bitmap doInBackground(String... strings) {
String url = strings[0];
Bitmap bitmapImage = null;
InputStream in = null;
try {
in = new URL(url).openStream();
bitmapImage = BitmapFactory.decodeStream(in);
in.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return bitmapImage;
}
@Override
protected void onPostExecute(Bitmap result) {
if (result != null) {
mBitmapImage.setImageBitmap(result);
} else {
mBitmapImage.setImageResource(R.drawable.loading_movie);
}
}
}
public static void downloadImage(String imageLocation, ImageView imageView) {
new DownloadImage(imageView).execute(MOVIE_POSTER_URL_REQUEST + imageLocation);
}
在适配器中我称之为:
void bindMovie(Movie movie) {
mMovie = movie;
mMovieTitle.setText(movie.getTitle());
mDescription.setText(movie.getOverview());
downloadImage(movie.getPosterPath(), mPoster);
}
答案 0 :(得分:2)
这实际上取决于Android系统的版本。
但是如果你想确保并行执行任务,请使用它(来自支持v.4库):AsyncTaskCompat.executeParallel(task, params);
深入解释(参见接受的答案):Running multiple AsyncTasks at the same time -- not possible?
<强>更新强>
正如您所说的,AsyncTaskCompat.executeParallel(task, params);
现在已在API 26中弃用,但我找不到解释原因。
因此,正如文档所说,您应该使用asyncTask.executeOnExecutor(task, params);
实现并行执行:
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
此方法通常与THREAD_POOL_EXECUTOR一起使用,以允许多个任务在由AsyncTask管理的线程池上并行运行,但是您也可以使用自己的Executor进行自定义行为。
答案 1 :(得分:1)
使用AsyncTask下载并行或顺序的图像吗?
对于Honeycomb及以上版本,default是一个串行执行器,它逐个执行任务。但是你可以通过ThreadPoolExecutor
执行: