使用piccaso进行图像缓存,用于支持离线和在线两者

时间:2016-11-16 07:23:37

标签: android image-loading image-caching

我在我的Android应用程序中使用Picasso进行图像缓存。但每当我打开应用程序时,图像开始从服务器加载。但我想从磁盘使用缓存的图像,同时它也应检查服务器上的新图像。和whatsapp一样。

如果我使用网络政策离线,它不会仅使用离线图像从服务器加载新图像。

url = Static.url+"users/image?id="+id;
    profileImg = R.drawable.user;
    Picasso.with(activity)
            .load(url)
            .placeholder(profileImg)
            .into(imageView, new Callback() {
                @Override
                public void onSuccess() {
                    Picasso.with(activity)
                            .load(url)
                            .networkPolicy(NetworkPolicy.OFFLINE)
                            .placeholder(profileImg)
                            .error(profileImg)
                            .into(imageView);
                }
                @Override
                public void onError() {
                    // Try again online if cache failed
                }
            });

上面的代码正在运行,但图片加载仍然不是很快。图像应该立即从缓存中加载,同时应该在线检查新图像。

请指导。

5 个答案:

答案 0 :(得分:1)

您可以使用此解决方法:

Picasso.with(context)
                    .load(Uri.parse("https://yoururl.com"))
                    .into(holder.storyBigThumb, new Callback() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError() {
                            // Try again online if cache failed
                            Picasso.with(context)
                                    .load(Uri.parse("https://yoururl.com"))
                            .networkPolicy(NetworkPolicy.OFFLINE)
                            .placeholder(R.drawable.user_placeholder)
                            .error(R.drawable.user_placeholder_error)
                                    .into(holder.storyBigThumb);
                        }
                    });

Picasso将尝试从服务器获取新图像,如果失败,它将从缓存中加载

答案 1 :(得分:1)

您可以将okhttp用于此目的。

在build.gradle文件中添加compile 'com.squareup.okhttp:okhttp:2.4.0'

创建一个扩展Application的类。例如:

public class YourApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        Picasso.Builder builder = new Picasso.Builder(this);
        builder.downloader(new OkHttpDownloader(this, Integer.MAX_VALUE));
        Picasso built = builder.build();
        built.setIndicatorsEnabled(true);
        built.setLoggingEnabled(true);
        Picasso.setSingletonInstance(built);
    }
}

现在您可以在Activity

中使用以下代码
Picasso.with(YourActivity.this).load(imageLink).networkPolicy(NetworkPolicy.OFFLINE).into(cover_image, new Callback() {
                    @Override
                    public void onSuccess() {                        }
                    @Override
                    public void onError() {
                        Picasso.with(YourActivity.this).load(imageLink).into(cover_image);
                    }
                });

而这一切。我认为上面的代码很容易理解。

答案 2 :(得分:1)

首先毕加索自动捕捉图像,第二个如果你想离线加载然后尝试加载在线的东西,你需要使用两个调用图像加载,第一个使用DiskPolicy从磁盘加载,第二个使用NetworkPolicy强制调用加载和从Web捕获。

答案 3 :(得分:1)

如果您的设备处于离线状态,首次加载效率很低。只需在加载前检查网络连接,然后应用正确的networkPolicy(离线与否)。

RequestCreator requestCreator = Picasso.with(context).load(url);
if (!Utils.isNetworkAvailable(context)) {
    // offline mode: load from cache directly
    requestCreator.networkPolicy(NetworkPolicy.OFFLINE);
}
requestCreator.into(imageView);

isNetworkAvailable函数:

public static boolean isNetworkAvailable(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = cm.getActiveNetworkInfo();
    // if no network is available networkInfo will be null
    // otherwise check if we are connected
    return networkInfo != null && networkInfo.isConnected();
}

答案 4 :(得分:0)