使用AsyncTask下载并行或顺序的图像?

时间:2017-08-18 06:44:09

标签: android android-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);
    }

2 个答案:

答案 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执行: