GVKun编程网logo

Android Picasso:更改URL缓存过期

21

本文将为您提供关于AndroidPicasso:更改URL缓存过期的详细介绍,同时,我们还将为您提供关于Android9.0Pie的Picasso图像加载问题、AndroidPicasso、Andro

本文将为您提供关于Android Picasso:更改URL缓存过期的详细介绍,同时,我们还将为您提供关于Android 9.0 Pie的Picasso图像加载问题、Android Picasso、Android Picasso 图片加载库基础使用详解、Android Picasso 最详细的使用指南的实用信息。

本文目录一览:

Android Picasso:更改URL缓存过期

Android Picasso:更改URL缓存过期

我正在使用Picasso来下载和显示所有应用程序中的图像.这些图像很少变化(它们被认为有效几个月).

是否有一种简单的方法可以让Picasso(或底层的okHttp)将这些图像保存在光盘上这么长时间?

解决方法:

磁盘缓存发生在HTTP客户端内的Picasso“下方”.实际上,这个过程是完全透明的.我们从未明确要求缓存版本或互联网版本,HTTP客户端将在内部做出决定并做正确的事情.

因为我们选择利用HTTP客户端进行缓存,所以我们几乎无法控制缓存的实际发生方式.要回答你的问题,不,没有办法告诉Picasso(或OkHttp)缓存图像的时间超过其标题允许的时间.

Android 9.0 Pie的Picasso图像加载问题

Android 9.0 Pie的Picasso图像加载问题

我无法使用Android 9.0
Pie中的Picasso库加载图像。实际上,它适用于以下版本。它没有显示任何错误消息。有人使用共享了他在Github上的日志

Picasso.get().setLoggingEnabled(true);

他有消息日志:

2018-10-19 13:13:20.467 24840-24862/com.xyz.test.testpicasso D/ViewContentFactory: initViewContentFetcherClass
2018-10-19 13:13:20.467 24840-24862/com.xyz.test.testpicasso I/ContentCatcher: ViewContentFetcher : ViewContentFetcher
2018-10-19 13:13:20.467 24840-24862/com.xyz.test.testpicasso D/ViewContentFactory: createInterceptor took 0ms
2018-10-19 13:13:20.468 24840-24862/com.xyz.test.testpicasso I/ContentCatcher: Interceptor : Catcher list invalid for com.xyz.test.testpicasso@com.xyz.test.testpicasso.MainActivity@147874166
2018-10-19 13:13:20.468 24840-24862/com.xyz.test.testpicasso I/ContentCatcher: Interceptor : Get featureInfo from config pick_mode
2018-10-19 13:13:20.485 24840-24840/com.xyz.test.testpicasso D/Picasso: Main        created      [R1] Request{https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png}
2018-10-19 13:13:20.492 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  enqueued     [R1]+6ms 
2018-10-19 13:13:20.492 24840-24866/com.xyz.test.testpicasso D/Picasso: Hunter      executing    [R1]+7ms 
2018-10-19 13:13:20.555 1531-1684/? I/ActivityManager: Displayed com.xyz.test.testpicasso/.MainActivity: +114ms
2018-10-19 13:13:20.555 5475-5603/? D/PowerKeeper.Event: notifyActivityLaunchTime: com.xyz.test.testpicasso/.MainActivity totalTime: 114
2018-10-19 13:13:20.709 735-816/? W/SurfaceFlinger: Attempting to set client state on removed layer: Splash Screen com.xyz.test.testpicasso#0
2018-10-19 13:13:20.710 735-816/? W/SurfaceFlinger: Attempting to destroy on removed layer: Splash Screen com.xyz.test.testpicasso#0
2018-10-19 13:13:20.775 1531-1684/? I/Timeline: Timeline: Activity_windows_visible id: ActivityRecord{821c51 u0 com.xyz.test.testpicasso/.MainActivity t4372} time:9356677
2018-10-19 13:13:21.003 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  retrying     [R1]+518ms 
2018-10-19 13:13:21.004 24840-24872/com.xyz.test.testpicasso D/Picasso: Hunter      executing    [R1]+519ms 
2018-10-19 13:13:21.513 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  retrying     [R1]+1027ms 
2018-10-19 13:13:21.514 24840-24877/com.xyz.test.testpicasso D/Picasso: Hunter      executing    [R1]+1028ms 
2018-10-19 13:13:21.516 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  batched      [R1]+1030ms for error
2018-10-19 13:13:21.717 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  delivered    [R1]+1232ms

Android Picasso

Android Picasso

官网:

http://square.github.io/picasso/

How to retrieve Bitmap with Picasso ?

http://stackoverflow.com/questions/20181491/use-picasso-to-get-a-callback-with-a-bitmap

Picasso框架实战演练:

http://blog.csdn.net/a1002450926/article/details/50437469 分析的相当好!

使用Picasso加载图片的内存优化实践

http://blog.csdn.net/ashqal/article/details/48005833

picasso缓存位置:

http://www.th7.cn/Program/Android/201507/515383.shtml

原作者的系列介绍:

https://futurestud.io/blog/picasso-image-resizing-scaling-and-fit

.resize(6000, 2000)

.onlyScaleDown() // the image will only be resized if it''s bigger than 6000x2000 pixels.

Picasso和Glide的对比:

http://blog.csdn.net/fancylovejava/article/details/44747759

Android Picasso 图片加载库基础使用详解

Android Picasso 图片加载库基础使用详解

前言

图片加载在 Android开发项目中是必不可少的,为了降低开发周期和难度,我们经常会选用一些图片加载的开源库,而Android发展到现在图片加载开源库也越来越多了,下面介绍 Picasso 开源图片加载库.

简介

Picasso中文翻译为''毕加索'',由Square公司开源的一个适用于Android的强大图像下载和缓存库.

功能介绍以及基础使用

1.配置

  • 在gradle添加依赖
implementation ''com.squareup.picasso:picasso:2.71828''
  • 添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
  • 基本使用
ImageView mImageView = (ImageView) findViewById(R.id.ImageView);
        String Url = "http:/*********";

        Picasso .with(this)
                .load(Url)
                .into(targetImageView);

2.功能介绍以及基本使用

  • 异步加载显示图片
ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);
        String Url = "http://**********";

//Picasso使用了流式接口的调用方式
        Picasso .with(context)
                .load(Url)
                .into(targetImageView);
  • 图片转换

转换图片以适合所显示的ImageView,来减少内存消耗

Picasso.with(context)
  .load(url)
//裁剪图片尺寸
  .resize(50, 50)
//设置图片圆角
  .centerCrop()
  .into(imageView)
  • 加载过程中和加载错误时显示对应图片
Picasso.with(context)
    .load(url)
//加载过程中的图片显示
    .placeholder(R.drawable.user_placeholder)
//加载失败中的图片显示
//如果重试3次还是无法成功加载图片,则用错误占位符图片显示。
    .error(R.drawable.user_placeholder_error)
    .into(imageView);
  • 在Adapter中的回收不在视野的ImageView和取消已经回收的ImageView下载进程

@Override
public void getView(int position, View convertView, ViewGroup parent) {
SquaredImageView view = (SquaredImageView) convertView;
if (view == null) {

view = new SquaredImageView(context);

}
String url = getItem(position);

Picasso.with(context).load(url).into(view);
}


* 加载多种不同数据源 网络、本地、资源、Assets 等

//加载资源文件
Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
//加载本地文件
Picasso.with(context).load(new File("/images/lunch_bees.gif")).into(imageView2);


* 默认配置自动添加磁盘和内存二级缓存功能

------------------------


至此,Picasso的基本功能和使用就介绍我完毕了,感谢阅读

欢迎关注作者[darryrzhong](http://www.darryrzhong.site),更多干货等你来拿哟.

### 请赏个小红心!因为你的鼓励是我写作的最大动力!
>更多精彩文章请关注
- [个人博客:darryrzhong](http://www.darryrzhong.xyz)
- [掘金](https://juejin.im/user/5a6c3b19f265da3e49804988)
- [简书](https://www.jianshu.com/users/b7fdf53ec0b9/timeline)
- [SegmentFault](https://segmentfault.com/u/darryrzhong_5ac59892a5882/articles)
- [慕课网手记](https://www.imooc.com/u/6733207)

Android Picasso 最详细的使用指南

Android Picasso 最详细的使用指南

Picasso 是 Square 公司开源的 Android 端的图片加载和缓存框架。Square 真是一家良心公司啊,为我们 Android 开发者贡献了很多优秀的开源项目有木有!像什么 Rerefoit 、OkHttp、LeakCanary、Picasso 等等都是非常火的开源项目。回到正题,除了使用简单方便,Picasso 还能自动帮我们做以下事情:

  • 处理 Adapter 中 ImageView 的回收和取消下载。
  • 使用最小的内存 来做复杂的图片变换。比如高斯模糊,圆角、圆形等处理。
  • 自动帮我们缓存图片。内存和磁盘缓存。

以上只是列出了 Picasso 比较核心的几点,其实它的优点远远不止这些,接下来就看一下如何使用 Picasso。

                  Picasso-Android.png

本文目录

0,添加依赖
1, 加载显示图片
2,Placeholder & noPlaceholder & noFade
3 , 设置图片尺寸 (Resize)、缩放 (Scale) 和裁剪 (Crop)
4,图片旋转 Rotation ()
5 , 转换器 Transformation
6,请求优先级
7,Tag 管理请求
8,同步/异步加载图片
9,缓存(Disk 和 Memory)
10,Debug 和日志
11,Picasso 扩展

正文

0. 添加依赖

要使用 Picasso, 首先我们要添加版本依赖,去官网或者 Github 看一下当前的最新版本 (截止本文最新版本为 2.5.2),然后在 build.gradle 中添加依赖:

1. 加载显示图片

将 Picasso 添加到项目之后,我们就可以用它来加载图片了,使用方法非常简单:

只需要一行代码就完成了加载图片到显示的整个过程,链式调用,非常简洁,其实有三步,一次调用了三个方法:

  • with (Context) 获取一个 Picasso 单例,参数是一个 Context 上下文
  • load (String) 调用 load 方法加载图片
  • into (ImageView) 将图片显示在对应的 View 上,可以是 ImageView,也可以是实现了 Target j 接口的自定义 View。

上面演示了加载一张网络图片,它还支持其它形式的图片加载,加载文件图片,加载本地资源图片,加载一个 Uri 路径给的图片,提供了几个重载的方法:

load (Uri uri) 加载一个以 Uri 路径给的图片

load (File file) 加载 File 中的图片

load (int resourceId) 加载本地资源图片

提醒:上面介绍了 load 的几个重载方法,加载不同资源的图片,另外提醒注意一下 load (String path) 接受 String 参数的这个方法,参数 String 可以是一个网络图片 url, 也可以是 file 路径、content 资源 和 Android Resource。看一下源码的注释。

要使用 string 参数加载上面的几种资源,除了网络 url, 其它几种需要加上对应前缀,file 文件路径前缀:file: , content 添加前缀:content: ,Android Resource 添加:android.resource:

2. placeholder& error & noPlaceholder & noFade

通过上面的第一步我们就可以通过 Picasso 加载图片了,我们的项目中通常最常用的就是加载网络图片,但是由于网络环境的差异,有时侯加载网络图片的过程有点慢,这样界面上就会显示空 ImageView 什么也看不见,用户体验非常不好。其实以前用过 ImageLoader 的同学都知道,ImageLoader 是可以设置加载中显示默认图片的,Picasso 当然也给我们提供了这个功能。

placeholder
placeholder 提供一张在网络请求还没有完成时显示的图片,它必须是本地图片,代码如下:

设置 placeholder 之后,在加载图片的时候,就可以显示设置的默认图了,提升用户体验。
error
和 placeholder 的用法一样,error 提供一张在加载图片出错的情况下显示的默认图

noPlaceholder
这个方法的意思就是:在调用 into 的时候明确告诉你没有占位图设置。根据这个方法签名的解释是阻止 View 被回收的时候 Picasso 清空 target 或者设置一个应用的占位图。需要注意的是 placeholder 和 noPlaceholder 不能同时应用在同一个请求上,会抛异常。

noFade
无论你是否设置了占位图,Picasso 从磁盘或者网络加载图片时,into 显示到 ImageView 都会有一个简单的渐入过度效果,让你的 UI 视觉效果更柔顺丝滑一点,如果你不要这个渐入的效果,就调用 noFade 方法。

3. 设置图片尺寸 (Resize)、缩放 (Scale) 和裁剪 (Crop)

Resize(int w,int h)
在项目中,为了带宽、内存使用和下载速度等考虑,服务端给我们的图片的 size 应该和我们 View 实际的 size 一样的,但是实际情况并非如此,服务端可能给我们一些奇怪的尺寸的图片,我们可以使用 resize (int w,int hei) 来重新设置尺寸。

resize () 方法接受的参数的单位是 pixels, 还有一个可以设置 dp 单位的方法,将你的尺寸写在 dimens.xml 文件中,然后用resizeDimen(int targetWidthResId, int targetHeightResId)方法

onlyScaleDown
当调用了 resize 方法重新设置图片尺寸的时候,调用 onlyScaleDown 方法,只有当原始图片的尺寸大于我们指定的尺寸时,resize 才起作用,如:

只有当原来的图片尺寸大于 4000 x 2000 的时候,resize 才起作用。
图片裁剪 centerCrop ()
这个属性应该不陌生吧!ImageView 的 ScaleType 就有这个属性。当我们使用 resize 来重新设置图片的尺寸的时候,你会发现有些图片拉伸或者扭曲了(使用 ImageView 的时候碰到过吧),我要避免这种情况,Picasso 同样给我们提供了一个方法,centerCrop,充满 ImageView 的边界,居中裁剪。

centerInside
上面的 centerCrop 是可能看不到全部图片的,如果你想让 View 将图片展示完全,可以用 centerInside,但是如果图片尺寸小于 View 尺寸的话,是不能充满 View 边界的。

fit
fit 是干什的呢?上面我们需要用 resize () 来指定我们需要的图片的尺寸,那就是说在程序中需要我们计算我们需要的尺寸(固定大小的除外),这样很麻烦,fit 方法就帮我们解决了这个问题。fit 它会自动测量我们的 View 的大小,然后内部调用 reszie 方法把图片裁剪到 View 的大小,这就帮我们做了计算 size 和调用 resize 这 2 步。非常方便。代码如下:

使用 fit 还是会出现拉伸扭曲的情况,因此最好配合前面的 centerCrop 使用,代码如下:

看一下对比图:
fit (会拉伸):

          image_fit.png

fit & centerCrop (不会拉伸):

          fit_centerCrop.png

注意:特别注意,
1,fit 只对 ImageView 有效
2,使用 fit 时,ImageView 宽和高不能为 wrap_content, 很好理解,因为它要测量宽高。

4. 图片旋转 Rotation ()

在图片显示到 ImageView 之前,还可以对图片做一些旋转操作,调用 rotate(int degree) 方法

这个方法它是以(0,0)点旋转,但是有些时候我们并不想以(0,0)点旋转,还提供了另外一个方法可以指定原点:

  • rotate (float degrees, float pivotX, float pivotY) 以 (pivotX, pivotY) 为原点旋转

5. 转换器 Transformation

Transformation 这就是 Picasso 的一个非常强大的功能了,它允许你在 load 图片 -> into ImageView 中间这个过成对图片做一系列的变换。比如你要做图片高斯模糊、添加圆角、做度灰处理、圆形图片等等都可以通过 Transformation 来完成。

来看一个高斯模糊的例子:

第一步,首先定义一个转换器继承 Transformation

  public static class BlurTransformation implements Transformation{

        RenderScript rs;

        public BlurTransformation(Context context) {
            super();
            rs = RenderScript.create(context);
        }

        @Override
        public Bitmap transform(Bitmap bitmap) {
            // Create another bitmap that will hold the results of the filter.
            Bitmap blurredBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

            // Allocate memory for Renderscript to work with
            Allocation input = Allocation.createFromBitmap(rs, blurredBitmap, Allocation.MipmapControl.MIPMAP_FULL, Allocation.USAGE_SHARED);
            Allocation output = Allocation.createTyped(rs, input.getType());

            // Load up an instance of the specific script that we want to use.
            ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
            script.setInput(input);

            // Set the blur radius
            script.setRadius(25);

            // Start the ScriptIntrinisicBlur
            script.forEach(output);

            // Copy the output to the blurred bitmap
            output.copyTo(blurredBitmap);

            bitmap.recycle();

            return blurredBitmap;
        }

        @Override
        public String key() {
            return "blur";
        }
    }

第二步,加载图片的时候,在 into 方法前面调用 transform 方法 应用 Transformation

  Picasso.with(this).load(URL)
                .placeholder(R.drawable.default_bg)
                .error(R.drawable.error_iamge)
                .transform(new BlurTransformation(this))
                .into(mBlurImage);

看一下效果图:

        transformation.png

上面为原图,下面为高斯模糊图

是不是很强大,任何复杂的变换都可以通过 Transformation 来做。

还不止于此,还有更强大的功能。可以在一个请求上应用多个 Transformation

比如:我想先做个度灰处理然后在做一个高斯模糊图:

第一步,定义一个度灰的 Transformation

  public static class GrayTransformation implements Transformation{

        @Override
        public Bitmap transform(Bitmap source) {
            int width, height;
            height = source.getHeight();
            width = source.getWidth();

            Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
            Canvas c = new Canvas(bmpGrayscale);
            Paint paint = new Paint();
            ColorMatrix cm = new ColorMatrix();
            cm.setSaturation(0);
            ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
            paint.setColorFilter(f);
            c.drawBitmap(source, 0, 0, paint);

            if(source!=null && source!=bmpGrayscale){
                source.recycle();
            }
            return bmpGrayscale;
        }

        @Override
        public String key() {
            return "gray";
        }
    }

第二步,如果是多个 Transformation 操作,有两种方式应用
方式一:直接调用多次 transform 方法,不会覆盖的。它只是保存到了一个 List 里面

  Picasso.with(this).load(URL)
                .placeholder(R.drawable.default_bg)
                .error(R.drawable.error_iamge)
                .fit()
                .centerCrop()
                .transform(new GrayTransformation())//度灰处理
                .transform(new BlurTransformation(this))//高斯模糊
                .into(mBlurImage);

需要注意调用的顺序
方式二:接受一个 List,将 Transformation 放大 list 里

     List<Transformation> transformations = new ArrayList<>();
        transformations.add(new GrayTransformation());
        transformations.add(new BlurTransformation(this));

        Picasso.with(this).load(URL)
                .placeholder(R.drawable.default_bg)
                .error(R.drawable.error_iamge)
                .fit()
                .centerCrop()
                .transform(transformations)
                .into(mBlurImage);

效果图:

          gray_blur.png

如上图,第一张为度灰操作,第二张为 度灰+高斯模糊

另外发现了一个开源库,专门写了很多好玩的 Transformation,有兴趣的可以看一下:
picasso-transformations

6. 请求优先级

Picasso 为请求设置有优先级,有三种优先级,LOW、NORMAL、HIGH。默认情况下都是 NORMAL,除了调用 fetch 方法,fetch 方法的优先级是 LOW。

可以通过 priority 方法设置请求的优先级,这会影响请求的执行顺序,但是这是不能保证的,它只会往高的优先级靠拢。代码如下:

7. Tag 管理请求

Picasso 允许我们为一个请求设置 tag 来管理请求,看一下对应的几个方法:
下面 3 个方法是 Picasso 这个类的:

  • cancelTag (Object tag) 取消设置了给定 tag 的所有请求
  • pauseTag (Object tag) 暂停设置了给定 tag 的所有请求
  • resumeTag (Object tag) resume 被暂停的给定 tag 的所有请求

还有一个方法是 RequestCreator 的:

  • tag (Object tag) 为请求设置 tag

几个方法的意思也很明确,就是我们可以暂停、resume、和取消请求,可以用在哪些场景呢?

场景一: 比如一个照片流列表,当我们快速滑动列表浏览照片的时候,后台会一直发起请求加载照片的,这可能会导致卡顿,那么我们就可以为每个请求设置一个相同的 Tag,在快速滑动的时候,调用 pauseTag 暂停请求,当滑动停止的时候,调用 resumeTag 恢复请求,这样的体验是不是就会更好一些呢。

Adapter 中添加如下代码:

Activity 中为 RecyclerView 添加滑动监听:

场景二: 比如一个照片流列表界面,在弱网环境下,加载很慢,退出这个界面时可能会有很多请求没有完成,这个时候我们就可 以通过 tag 来取消请求了。

8. 同步/异步加载图片

Picasso 加载图片也有同步/异步两种方式
同步 get () 
很简单,同步加载使用 get () 方法,返回一个 Bitmap 对象,代码如下:

注意:使用同步方式加载,不能放在主线程来做。

异步 fetch ()
一般直接加载图片通过 into 显示到 ImageView 是异步的方式,除此之外,还提供了 2 个异步的方法:

  • fetch () 异步方式加载图片
  • fetch (Callback callback) 异步方式加载图片并给一个回调接口。

这里就要吐槽一下接口设计了,回调并没有返回 Bitmap, 不知道作者是怎么考虑的,只是一个通知效果,知道请求失败还是成功。
**fetch 方法异步加载图片并没有返回 Bitmap,这个方法在请求成功之后,将结果存到了缓存,包括磁盘和内存缓存。所以使用这种方式加载图片适用于这种场景:知道稍后会加载图片,使用 fetch 先加载缓存,起到一个预加载的效果。 **

9. 缓存(Disk 和 Memory)

Picasso 有内存缓存 (Memory) 和磁盘缓存( Disk), 首先来看一下源码中对于缓存的介绍:

  • LRU memory cache of 15% the available application RAM
  • Disk cache of 2% storage space up to 50MB but no less than 5MB. (Note: this is only
    available on API 14+ <em>or</em> if you are using a standalone library that provides a disk cache on all API levels like OkHttp)
  • Three download threads for disk and network access.

可以看出,内存缓存是使用的 LRU 策略的缓存实现,它的大小是内存大小的 15%, 可以自定义它的大小,最后在扩展那一章节再讲,磁盘缓存是磁盘容量的 2% 但是不超过 50M, 不少于 5M。处理一个请求的时候,按照这个顺讯检查:memory->disk->network 。先检查有木有内存缓存,如果命中,直接返回结果,否则检查磁盘缓存,命中则返回结果,没有命中则从网上获取。

默认情况下,Picasso 内存缓存和磁盘缓存都开启了的,也就是加载图片的时候,内存和磁盘都缓存了,但是有些时候,我们并不需要缓存,比如说:加载一张大图片的时候,如果再内存中保存一份,很容易造成 OOM, 这时候我们只希望有磁盘缓存,而不希望缓存到内存,因此就需要我们设置缓存策略了。Picasso 提供了这样的方法。

方式一:memoryPolicy 设置内存缓存策略
就像上面所说的,有时候我们不希望有内存缓存,我们可以通过 memoryPolicy 来设置。MemoryPolicy 是一个枚举,有两个值

NO_CACHE:表示处理请求的时候跳过检查内存缓存
**NO_STORE: ** 表示请求成功之后,不将最终的结果存到内存。

示例代码如下:

方式二:networkPolicy 设置磁盘缓存策略

和内存缓存一样,加载一张图片的时候,你也可以跳过磁盘缓存,和内存缓存策略的控制方式一样,磁盘缓存调用方法networkPolicy(NetworkPolicy policy, NetworkPolicy... additional) , NetworkPolicy 是一个枚举类型,有三个值:

NO_CACHE: 表示处理请求的时候跳过处理磁盘缓存
NO_STORE: 表示请求成功后,不将结果缓存到 Disk,但是这个只对 OkHttp 有效。
OFFLINE: 这个就跟 上面两个不一样了,如果 networkPolicy 方法用的是这个参数,那么 Picasso 会强制这次请求从缓存中获取结果,不会发起网络请求,不管缓存中能否获取到结果。

使用示例:

强制从缓存获取:

10. Debug 和日志

缓存指示器

上一节说了,Picasso 有内存缓存和磁盘缓存,先从内存获取,没有再去磁盘缓存获取,都有就从网络加载,网络加载是比较昂贵和耗时的。因此,作为一个开发者,我们往往需要加载的图片是从哪儿来的(内存、Disk 还是网络),Picasso 让我们很容易就实现了。只需要调用一个方法setIndicatorsEnabled(boolean)就可以了,它会在图片的左上角出现一个带色块的三角形标示,有 3 种颜色,绿色表示从内存加载、蓝色表示从磁盘加载、红色表示从网络加载。

效果图:

 
            cache_indicator.png

如上图所示,第一张图从网络获取,第二张从磁盘获取,第三张图从内存获取。

看一下源码中定义指示器的颜色:

可以很清楚看出,对应三种颜色代表着图片的来源。

日志
上面的指示器能够很好的帮助我们看出图片的来源,但是有时候我们需要更详细的信息,Picasso, 可以打印一些日志,比如一些关键方法的执行时间等等,我们只需要调用 setLoggingEnabled(true) 方法,然后 App 在加载图片的过程中,我们就可以从 logcat 看到一些关键的日志信息。

11. Picasso 扩展

到目前为止,Picasso 的基本使用已经讲得差不多了,但是在实际项目中我们这可能还满足不了我们的需求,我们需要对它做一些自己的扩展,比如我们需要换缓存的位置、我们需要扩大缓存、自定义线程池、自定义下载器等等。这些都是可以的,接下来我们来看一下可以做哪些方面的扩展。

用 Builder 自己构造一个 Picasso Instance
我们来回顾一下前面是怎么用 Picasso 加载图片的:

总共 3 步:
(1) 用 with 方法获取一个 Picasso 示例
(2) 用 load 方法加载图片
(3) 用 into 放法显示图片

首先 Picasso 是一个单例模式,我们每一次获取的示例都是默认提供给我们的实例。但是也可以不用它给的 Instance, 我们直接用 builder 来构造一个 Picasso:

这样我们就构造了一个局部的 Picasso 实例,当然了,我们直接用 new 了一个 builder,然后 build () 生成了一个 Picasso。这跟默认的通过 with 方法获取的实例是一样的。那么现在我们就可以配置一些自定义的功能了。

配置自定义下载器 downLoader
如果我们不想用默认提供的 Downloader, 那么我们可以自定义一个下载器然后配置进去。举个例子:

总共 5 步:
(1) 先自定义一个 Downloader (只是举个例子,并没有实现):

(2) 然后通过 builder 配置:

这样配置后,我们用 build () 生成的 Picasso 实例来加载图片就会使用自定义的下载器来下载图片了。

(3) 配置缓存
前面说过,内存缓存是用的 LRU Cahce , 大小是手机内存的 15% ,如果你想缓存大小更大一点或者更小一点,可以自定义,然后配置。

上面只是一个简单的举例,当然了你可以自定义,也可以使用 LRUCache, 改变大小,改变存储路径等等。

提示: 很遗憾,好像没有提供改变磁盘缓存的接口,那就只能用默认的了。

(4) 配置线程池
Picasso 默认的线程池的核心线程数为 3,如果你觉得不够用的话,可以配置自己需要的线程池,举个列子:

(5) 配置全局的 Picasso Instance
上面说的这些自定义配置项目都是应用在一个局部的 Picasso instance 上的,我们不可能每一次使用都要重新配置一下,这样就太麻烦了。我们希望我们的这些自定义配置能在整个项目都应用上,并且只配置一次。其实 Picasso 给我们提供了这样的方法。可以调用setSingletonInstance(Picasso picasso)就可以了,看一下这个方法的源码:

设置一个通过 with 方法返回的全局 instance。我们只希望配置一次,所以,我们应该在 Application 的 onCreate 方法中做全局配置就可以了。app 一启动就配置好,然后直接和前面的使用方法一样,调用 with 方法获取 Picasso instance 加载图片就 OK 了。

因此在 Application 中添加如下代码:

然后应用这些自定义配置加载图片

用法和以前的一样,但是我们已经将我们的自定义配置应用上了。

结尾

以上就是对 Picasso 用法的全部总结,如有什么问题,欢迎留言指正。Picasso 真的是一个强大的图片加载缓存库,API 简单好用,而且是链式调用的(这点我特别喜欢)。官方文档写的比较简单,很多用法都要看源码和注释才知道。希望本文能给才开始使用 Picasso 的同学一点帮助。



作者:依然范特稀西
链接:https://www.jianshu.com/p/c68a3b9ca07a
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

关于Android Picasso:更改URL缓存过期的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android 9.0 Pie的Picasso图像加载问题、Android Picasso、Android Picasso 图片加载库基础使用详解、Android Picasso 最详细的使用指南的相关知识,请在本站寻找。

本文标签: