首页 > 解决方案 > 使用 Glide 加载 url 的数组列表

问题描述

我正在尝试加载 URL 的 ArrayList 并使用滑行从它们中获取位图,我的代码在下面不起作用,Toast 向我显示0作为消息。

   @SuppressLint("CheckResult")
    public void getBitmapFromUrls() {
        final ArrayList<Bitmap> arrayBitmaps = new ArrayList<>();
        RequestOptions requestOptions = new RequestOptions();
        requestOptions.diskCacheStrategy(DiskCacheStrategy.ALL).dontTransform();
        for (int i = 0; i < listItems.size(); i++) {
            Glide.with(getActivity())
                    .asBitmap()
                    .apply(requestOptions)
                    .load(listItems.get(i).getImgUrl())
                    .into(new SimpleTarget<Bitmap>() {
                        @Override
                        public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                            arrayBitmaps.add(resource);
                        }
                    });
        }
        Toast.makeText(getActivity(), "" + arrayBitmaps.size(), Toast.LENGTH_SHORT).show();

    }

标签: javaandroidarraylistbitmapandroid-glide

解决方案


当您调用 Glide 加载图像时,它会产生一些后台线程来执行工作(从服务器加载图像)。同时,您在 UI 线程上显示 Toast 以显示位图列表的大小。但是当时后台线程可能正在处理中并且还没有返回结果。所以位图列表的大小为0。

您可以将代码更改为:

for (int i = 0; i < listItems.size(); i++) {
    Glide.with(getActivity())
            .asBitmap()
            .apply(requestOptions)
            .load(listItems.get(i).getImgUrl())
            .into(new SimpleTarget<Bitmap>() {
                @Override
                public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                    arrayBitmaps.add(resource);
                    // All images has been loaded and add to bitmap list as well.
                    if (arrayBitmaps.size == listItems.size()) {
                        Toast.makeText(getActivity(), "" + arrayBitmaps.size(), Toast.LENGTH_SHORT).show();
                    }
                }
            });
}

推荐阅读