2016-11-16 66 views
1

我在我的android应用程序中使用毕加索进行图片缓存。但每当我打开应用程序的图像开始从服务器加载。但我想从磁盘使用缓存的图像,同时它也应该检查服务器上的新图像。和whatsapp一样。使用piccaso进行图片缓存,支持离线和在线两种

如果我使用网络策略脱机,它不会从服务器加载新图像,它只是使用脱机图像。

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

上述代码正在工作,但图像加载仍然不是很快。应该立即从缓存中加载图像,并且应该在同一时刻在线检查新图像。

请指导。

+0

后你已经尝试 – SaravInfern

回答

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

毕加索将尝试从服务器获取一个新的形象,如果失败的话,它会从缓存

+0

图像应该从高速缓存加载第一则应该在网上查询,但它不是从缓存中.. – Suresh

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

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

1

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

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