【问题标题】:Image caching using piccaso, for supporting offline and online both使用 piccaso 进行图像缓存,支持离线和在线
【发布时间】:2016-11-16 07:23:37
【问题描述】:

我在我的 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
                }
            });

上面的代码可以运行,但是图片加载速度仍然不是很快。图片应立即从缓存中加载,同时在线检查是否有新图片。

请指导。

【问题讨论】:

  • 发布您尝试过的内容

标签: android image-loading image-caching


【解决方案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 将尝试从服务器获取新图像,如果失败,将从缓存中加载它

【讨论】:

  • 图片应该先从缓存中加载,然后在线检查,但不是从缓存中加载..
【解决方案2】:

您可以为此使用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);
                    }
                });

仅此而已。我觉得上面的代码很容易理解。

【讨论】:

    【解决方案3】:

    首先 Picasso 自动捕获图像,其次如果您想离线加载然后尝试加载在线内容,您需要使用两次图像加载调用,第一次使用 DiskPolicy 从磁盘加载,第二次使用NetworkPolicy 强制调用从 web 加载和捕获。

    【讨论】:

      【解决方案4】:

      如果您的设备处于离线状态,则执行第一次加载是低效的。只需在加载前检查网络连接,然后应用正确的 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();
      }
      

      【讨论】:

        【解决方案5】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-04
          • 1970-01-01
          • 1970-01-01
          • 2011-10-27
          • 2018-09-29
          • 2018-05-29
          相关资源
          最近更新 更多