使用 AsyncTask 的图像是并行下载还是按顺序下载?



我做了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);
}

这实际上取决于Android系统的版本。

但是,如果您想确保并行执行任务,请使用以下命令(来自支持 v.4 库(:AsyncTaskCompat.executeParallel(task, params);

深入解释(见接受的答案(:同时运行多个异步任务 - 不可能吗?

更新:

正如您公平地说的那样,AsyncTaskCompat.executeParallel(task, params);现在在 API 26 中被弃用,尽管我找不到解释原因。

因此,正如文档所说,您应该使用asyncTask.executeOnExecutor(task, params);

要实现并行执行,请执行以下操作:

asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);

此方法通常与 THREAD_POOL_EXECUTOR 一起使用,以允许多个任务在 AsyncTask 管理的线程池上并行运行,但您也可以使用自己的执行程序进行自定义行为。

使用 AsyncTask 的映像是并行下载还是按顺序下载?

对于 Honeycomb 及更高版本,默认为串行执行器,它逐个执行任务。但是你可以传递一个执行ThreadPoolExecutor

最新更新