我在我的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
}
});
上面的代码正在运行,但图片加载仍然不是很快。图像应该立即从缓存中加载,同时应该在线检查新图像。
请指导。
答案 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)