【问题标题】:How to priorly get future Glide image size which will be stored in cache in Android/Java?如何事先获取将存储在 Android/Java 缓存中的未来 Glide 图像大小?
【发布时间】:2020-10-18 18:52:45
【问题描述】:

在 MainActivity 中,我根据 imageview 大小使用 glide 将一些图像加载到 recyclerview 中。

见:

 @Override
    public void onBindViewHolder(PreviewAdapter.MyViewHolder holder, int position) {
        Glide.with(context).load(previewArrayList.get(position).getUrl()).diskCacheStrategy(DiskCacheStrategy.AUTOMATIC).into(holder.postImage);
}

XML:

<ImageView
    android:id="@+id/post_image"
    android:layout_width="match_parent"
    android:layout_marginTop="4dp"
    android:layout_height="250dp"
    android:layout_below="@+id/post_name"
    android:scaleType="centerCrop" />

如你所见,我也使用 Glide 缓存 DiskCacheStrategy.AUTOMATIC 以便下次没有 Internet Glide 时可以显示图像。现在你可以在https://medium.com/@multidots/glide-vs-picasso-930eed42b81d这个帖子中看到“Glide resizes the image as per the dimension of the ImageView.

现在,我想要在 SpalshActivity 中的最终大小,Glide 将存储在缓存中。因此,当 SpalshActivity 之后,当用户第一次打开 MainActivity 没有 Internet Conncetion 时,它应该加载图像。

那怎么可能呢?

在 SpalshActivity 中,我已经在缓存图像,但它又是第一次在 MainActivity 中下载/调整大小。

SpalshActivity:

private void preloadImage(String url) {
        try {

            //File file = Glide.with(this).asFile().load(url).submit().get();
            //String path = file.getPath();


            Glide.with(this)
                    .load(url)
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .listener(new RequestListener<Drawable>() {
                        @Override
                        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                            if (isPostDataLoaded) {
                                postImagesLoaded++;
                                if (postImagesLoaded == postImagesCount) {
                                    binding.progressBar.setVisibility(View.GONE);
                                    AlertDialogManager.showAlertDialogMessage(SplashActivity.this, "Error", "Something went wrong, Please try again later", false, "Exit", null, SplashActivity.this, IS_TABLET);
                                }
                            } else {
                                previewImagesLoaded++;
                                if (previewImagesLoaded == previewImagesCount) {
                                    binding.progressBar.setVisibility(View.GONE);
                                    AlertDialogManager.showAlertDialogMessage(SplashActivity.this, "Error", "Something went wrong, Please try again later", false, "Exit", null, SplashActivity.this, IS_TABLET);
                                }
                            }
                            return true;
                        }

                        @Override
                        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                            if (isPostDataLoaded) {
                                postImagesLoaded++;
                                if (postImagesLoaded == postImagesCount) {
                                    PostSingleton.getInstance().setPostMap(postMap);
                                    startFreshActivity(PreviewActivity.class);
                                }
                            } else {
                                previewImagesLoaded++;
                                if (previewImagesLoaded == previewImagesCount) {
                                    PreviewSingleton.getInstance().setPreviewList(previewList);
                                    getPostImageCount();
                                    postPreloadAllImages();
                                }
                            }
                            return true;
                        }
                    }).preload();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

【问题讨论】:

    标签: java android android-glide


    【解决方案1】:

    最好使用.downloadOnly() 预加载所有图像,而不是使用任何target。然后使用FileProvider加载图片。

    private class CacheImage extends AsyncTask<String,Void,File> {
            @Override
            protected File doInBackground(String... strings) {
                try {
                    return Glide.with(getContext())
                            .load(strings[0])
                            .downloadOnly(Target.SIZE_ORIGINAL,Target.SIZE_ORIGINAL)
                            .get();
                } catch (Exception e) {
                    Log.e(LOG_TAG,e.getMessage());
                    return null;
                }
            }
    
            @Override
            protected void onPostExecute(File file) {
                if(file!=null){
                   Uri file_uri = FileProvider.getUriForFile(getContext(),
                            getContext().getPackageName()+".images",file);
                }
            }
        }
    

    并将路径与 URL 一起存储在 SQLite 中。 现在使用 SQLite 中的FileProvider 获取image_url

    Glide.with(imageView.getContext())
                    .load(<image_url>)
                    .asBitmap()
                    .dontAnimate()
                    .centerCrop()
                    .override(<width>,<height>)
                    .priority(Priority.IMMEDIATE)
                    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                    .skipMemoryCache(true)
                    .into(imageView);
    

    您可能还需要添加,

    在清单中,在 &lt;application&gt; 内部

    <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="{app package name}.images"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
    

    res/xml 内,作为file_paths.xml

    <paths xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
        <cache-path name="images" path="image_manager_disk_cache"
            tools:path="DiskCache.Factory.DEFAULT_DISK_CACHE_DIR" />
    </paths>
    

    【讨论】:

    • 非常感谢。我会实现这个。请给点时间
    • 使用 SQLite 将您从 CacheImage 获得的值与基本图像 URL 一起存储在 DB 表中,CacheImageTable(url TEXT UNIQUE, file_path TEXT)
    • 当然。我会这样做的
    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2023-02-13
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多