如何预先获取将存储在 Android/Java 缓存中的未来 Glide 图像大小? [英] How to priorly get future Glide image size which will be stored in cache in Android/Java?

查看:27
本文介绍了如何预先获取将存储在 Android/Java 缓存中的未来 Glide 图像大小?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In MainActivity, I'm loading some images using glide into recyclerview according to imageview size.

见:

 @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 根据 ImageView 的尺寸调整图像大小."

As you can observe, I'm using Glide cache DiskCacheStrategy.AUTOMATIC also so that next time without Internet Glide can show the images. Now you can read in this post https://medium.com/@multidots/glide-vs-picasso-930eed42b81d that " Glide resizes the image as per the dimension of the ImageView."

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

Now, I want that final size inside SpalshActivity, which Glide will be stored in cache. So that when After SpalshActivity, when user opens MainActivity without Internet Conncetion for the very first time also, then it should load Images.

那怎么可能呢?

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

In SpalshActivity, I'm already caching Images, but it is again downloading/resizing in MainActivity for the very first time.

SpalshActivity:

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();
        }
    }

推荐答案

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

Better to preload all the images with .downloadOnly() instead of using any target. Then load images using 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 中.现在使用 FileProvider 从 SQLite

And store the path alongside URL in SQLite. Now get the image_url using FileProvider from SQLite

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

您可能还需要添加,

在清单中,在

<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>

这篇关于如何预先获取将存储在 Android/Java 缓存中的未来 Glide 图像大小?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆