我正在使用毕加索在我的android应用程序中显示图像:
/**
* load image.This is within a activity so this context is activity
*/
public void loadImage (){
Picasso picasso = Picasso.with(this);
picasso.setDebugging(true);
picasso.load(quiz.getImageUrl()).into(quizImage);
}
我启用了调试,它总是显示红色和绿色,.But从不显示黄色
现在,如果我下一次加载相同的图像,并且互联网不可用,则图像不会被加载。
问题:
发布于 2015-06-07 03:56:43
这就是我所做的。效果很好。
首先,将OkHttp添加到应用程序模块的gradle build文件中:
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp3:okhttp:3.10.0'
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
然后创建一个扩展Application
的类
import android.app.Application;
import com.jakewharton.picasso.OkHttp3Downloader;
import com.squareup.picasso.Picasso;
public class Global extends Application {
@Override
public void onCreate() {
super.onCreate();
Picasso.Builder builder = new Picasso.Builder(this);
builder.downloader(new OkHttp3Downloader(this,Integer.MAX_VALUE));
Picasso built = builder.build();
built.setIndicatorsEnabled(true);
built.setLoggingEnabled(true);
Picasso.setSingletonInstance(built);
}
}
将其添加到Manifest文件中,如下所示:
<application
android:name=".Global"
.. >
</application>
现在,您可以像往常一样使用毕加索。没有变化。
编辑:
如果您只想使用缓存的图像。像这样调用库。我注意到,如果我们不添加networkPolicy,图像将不会在完全脱机启动中显示,即使它们是缓存的。下面的代码解决了这个问题。
Picasso.with(this)
.load(url)
.networkPolicy(NetworkPolicy.OFFLINE)
.into(imageView);
编辑#2
上面代码的问题是,如果清除缓存,Picasso将继续在缓存中脱机查找它并失败,下面的代码示例查看本地缓存,如果没有找到脱机缓存,它将联机并补充缓存。
Picasso.with(getActivity())
.load(imageUrl)
.networkPolicy(NetworkPolicy.OFFLINE)
.into(imageView, new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
//Try again online if cache failed
Picasso.with(getActivity())
.load(posts.get(position).getImageUrl())
.error(R.drawable.header)
.into(imageView, new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
Log.v("Picasso","Could not fetch image");
}
});
}
});
发布于 2014-12-11 19:25:42
1)第一个问题的答案:根据Picasso Doc for With() method
从with()返回的全局默认毕加索实例会自动使用适用于大多数实现的默认值进行初始化。
全局默认毕加索的但 Disk Cache
操作仅在14+接口上可用
2)第二个问题的答案:Picasso
使用HTTP
客户端请求Disk Cache
操作,这样您就可以使用<>d23http request header >创建自己的http request header
Cache-Control
属性,并使用
1] HttpResponseCache (注:仅适用于13+接口)
2] OkHttpClient (适用于所有API)
使用OkHttpClient
创建自己的静态毕加索类的示例:
picasso
对象导入android.content.Context;导入com.squareup.picasso.Downloader;导入com.squareup.picasso.OkHttpDownloader;导入com.squareup.picasso.Picasso;公有类PicassoCache { /** *静态毕加索实例*/私有静态毕加索picassoInstance = null;/** * PicassoCache构造函数** @param context应用上下文*/私有PicassoCache (Context context) { Downloader downloader =新OkHttpDownloader( Context,Integer.MAX_VALUE);Picasso.Builder builder =新Picasso.Builder(上下文);builder.downloader(下载器);picassoInstance = builder.build();} /** *获取单例毕加索实例**@参数上下文应用上下文*@返回毕加索实例*/公共静态毕加索getPicassoInstance (上下文上下文){ if (picassoInstance == null) {新PicassoCache(上下文);Picasso.With()
picassoInstance;} return picassoInstance;}}
picasso
对象而不是returnPicassoCache.getPicassoInstance(getContext()).load(imagePath).into(imageView)
3)对第三个问题的回答:磁盘缓存操作不需要任何磁盘权限
参考:Github issue about disk cache,@jake-wharton -> Question1和Question2回答了两个问题
发布于 2015-10-21 01:10:20
对于缓存,我将使用OkHttp 拦截器来控制缓存策略。查看包含在OkHttp库中的这个示例。
RewriteResponseCacheControl.java
以下是我对毕加索的用法-
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.networkInterceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
return originalResponse.newBuilder().header("Cache-Control", "max-age=" + (60 * 60 * 24 * 365)).build();
}
});
okHttpClient.setCache(new Cache(mainActivity.getCacheDir(), Integer.MAX_VALUE));
OkHttpDownloader okHttpDownloader = new OkHttpDownloader(okHttpClient);
Picasso picasso = new Picasso.Builder(mainActivity).downloader(okHttpDownloader).build();
picasso.load(imageURL).into(viewHolder.image);
https://stackoverflow.com/questions/23978828
复制相似问题