Android圖片加載框架Picasso最全使用教程 五

在之前的四篇博客中,我們學習了所有的關於Picasso的主要方法,我們也對這個Picasso有了一個很深的認識,下面就主要對Picasso自身進行分析,這樣的話,會讓我們更瞭解Picasso的核心方法;

創建一個Picasso

Picasso有一個直接的方法去創建一個它的實例,就是Picasso.Builder,這樣可以創建屬於我們自己的Picasso,而不是使用一個標準的Picasso;

標準創建方式

我們最常用的就是直接調用Picasso.with(context);就能返回一個Picasso實例,這就是一個標準的Picasso,很簡單;

Picasso picasso = Picasso.with(context);

自定義創建實例

自定義就是調用Picasso.Builder,這是一個我們自己的Picasso,當然,也默認也實現的是標準的Picasso的所有功能,我們也可以像用標準的Picasso一樣進行使用;

Picasso.Builder picassoBuilder = new Picasso.Builder(context);
Picasso picasso = picassoBuilder.build();  
picasso  
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .into(imageView1);

將自定義Picasso變成全局使用

我們可以在應用啓動的時候調用Picasso.setSingletonInstance(picasso);,這樣的話後面所有的調用Picasso.with(context)返回的都是我們自定義的Picasso;

try{
    Picasso.Builder picassoBuilder = new Picasso.Builder(context);
    Picasso picasso = picassoBuilder.build();  
    Picasso.setSingletonInstance(picasso);
}catch(IllegalStateException ignored){
    //Picasso示例已經被設置過時會出現該異常
    //在Picasso.with(context)調用之後進行設置也會出現該異常
}

更改Picasso中的Downloader

如果你想更換默認的Downloader,你可以通過Picasso.Builder調用.downloader(Downloader downloader),傳入一個實現Downloader的實現類,比如OkHttpDownloader,上代碼:

Picasso.Builder picassoBuilder = new Picasso.Builder(context);

//在創建Picasso的示例之前更改downloader
picassoBuilder.downloader(new OkHttpDownloader(new OkHttpClient()));

// 創建實例
Picasso picasso = picassoBuilder.build();

picasso  
   .load(UsageExampleListViewAdapter.eatFoodyImages[2])
   .into(imageView3);

但是有一個需要注意的地方,如果你加載的圖片是從自己服務器上獲取的,而且服務器用的是HTTPS,而且需要一個簽名,這個時候OKHttp就會因爲SSL的問題而導致圖片無法被加載,這時你可以選擇使用UnsafeOkHttpClient,就可以避免該問題的產生;

picassoBuilder.downloader(  
    new OkHttpDownloader(
        UnsafeOkHttpClient.getUnsafeOkHttpClient()
    )
);

內存緩存自定義及Request Handlers

  • Memory Cache - 如果你不滿足系統默認的15%的可用空間的內存緩存大小,可以根據Picasso.Builder來自定義設置

  • Request Handlers - 如果你習慣於一個自定義URI的形式(內容提供者)進行圖片訪問,這裏會提供一個很強大的工具,Request Handlers

自定義Request Handlers

首先需要我們自定義一個類來繼承抽象類RequestHandler,實現裏面的兩個抽象方法

  1. boolean canHandleRequest(Request data) : 該方法是爲了讓Picasso來判斷當前的request handler是否能處理現在的請求,如果可以,就去調用load()方法

  2. Result load(Request request, int networkPolicy) : 處理請求

示例代碼:

/**
* 自定義一個類來繼承RequestHandler
*/
public class EatFoodyRequestHandler extends RequestHandler {  
    private static final String EAT_FOODY_RECIPE_SCHEME = "eatfoody";

    @Override
    public boolean canHandleRequest(Request data) {
        //判斷當前請求是否是自定義的URI (eg:eatfoody://cupcake)  ,如果是就會調用load方法
        return EAT_FOODY_RECIPE_SCHEME.equals(data.uri.getScheme());
    }

    @Override
    public Result load(Request request, int networkPolicy) throws IOException {
       // 我們可以進行網絡請求或者進行本地加載,然後返回一個Result

       // 從請求中獲取一個key值
       // 如果自定義URI爲: "eatfoody://cupcake", key的值爲 "cupcake"
       String imageKey = request.uri.getHost();

       Bitmap bitmap;
        //加載本地圖片
       if (imageKey.contentEquals("cupcake")) {
           bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.cupcake);
       }
       else if (imageKey.contentEquals("full_cake")) {
           bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.full_cake);
       }
       else {

           bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
       }

       // 返回一個result
       return new Result(bitmap, Picasso.LoadedFrom.DISK);
    }
}

//在Picasso中使用也很簡單
Picasso.Builder picassoBuilder = new Picasso.Builder(context);

picassoBuilder.addRequestHandler(new EatFoodyRequestHandler());

Picasso picasso = picassoBuilder.build(); 

//這是我們之前寫的請求圖片代碼
//  picasso  
//    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
//    .into(imageView1);

//如果使用了自定義的URI進行請求,就可以這樣寫,是不是很簡單
picasso  
    .load("eatfoody://cupcake")
    .into(imageView2);

picasso  
    .load("eatfoody://full_cake")
    .into(imageView3);

OK,到此,我們關於Picasso的用法已經全部介紹完畢,隨後一篇我們將對Picasso的原理進行剖析,來看Picasso底層是怎麼工作的,冰凍三尺非一日之寒,願大家都有美好的一天~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章