Okhttp和Picasso配合使用

編輯於2017年3月24日

Okhttp直接使用大神鴻洋的封裝,鏈接http://blog.csdn.net/lmj623565791/article/details/49734867
步驟:

一,引用okhttp包、鴻洋的okhttputils包,以及即將用到的picasso包。

二,配置屬於自己的okhttp。

 

public class MyApplication extends Application {
    private static Context mApplicationContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mApplicationContext=getApplicationContext();
        initOkHttpUtils();
        initPicasso();
    }

    /**
     * 可以在此處配置自己需要的配置,默認爲鴻洋的配置
     */
    private void initOkHttpUtils() {
//        OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
//        OkHttpUtils.initClient(okHttpClient);
    }

    /**
     * 初始化單例Picasso對象
     */
    private void initPicasso() {
        //配置Picasso
        Picasso picasso = new Picasso.Builder(this)
                //設置內存緩存大小,10M
                .memoryCache(new LruCache(10 << 20))
                //下載圖片的格式,這樣可以節省一半的內存
                .defaultBitmapConfig(Bitmap.Config.RGB_565)
                //配置下載器,這裏用的是OkHttp,必需單獨加OkHttp,同時設置了磁盤緩存的位置和大小
                //.downloader(new UrlConnectionDownloader())
                .downloader(new MyImageDownloader(getCacheDir(), 20 << 20))
                //設置圖片左上角的標記
                //紅色:代表從網絡下載的圖片
                //藍色:代表從磁盤緩存加載的圖片
                //綠色:代表從內存中加載的圖片
                .indicatorsEnabled(true)
                //.loggingEnabled(true)
                .build();
        Picasso.setSingletonInstance(picasso);
    }
}


三,在圖片需要網絡獲取的時候,讓picasso關聯okhttp。

 

四,參考OkHttpDownloader類自定義屬於自己的OkHttpDownloader。

1、實現Downloader接口,重寫load和shutdown方法,沒有特殊需求則直接複製OkHttpDownloader中的load和shutdown方法

從上圖可以發現client報紅,這個client正應該是我們自定義的okhttpclient。

2、定義OkHttpClient成員變量,並在構造方法中初始化爲自定義的okhttpclient。

    private final OkHttpClient client;

    public Down() {
        this.client = OkHttpUtils.getInstance().getOkHttpClient();
    }


3、重載構造方法,使Okhttp可以緩存圖片。

 

 

    public Down(final File cacheDir, final long maxSize) {
        this.client = OkHttpUtils.getInstance().getOkHttpClient();
        try {
            client.newBuilder().cache(new okhttp3.Cache(cacheDir,maxSize)).build();
        } catch (Exception ignored) {
        }
    }


4、提取一下公共代碼

 

 

    private static OkHttpClient defaultOkHttpClient() {
        OkHttpClient client = OkHttpUtils.getInstance().getOkHttpClient();
        Log.d("MyOKHttpDownloader", "---->defaultOkHttpClient(): " + client.toString());
        return client;
    }

    private final OkHttpClient client;

    public Down(final File cacheDir, final long maxSize) {
        this(defaultOkHttpClient());
        try {
            client.newBuilder().cache(new okhttp3.Cache(cacheDir,maxSize)).build();
        } catch (Exception ignored) {
        }
    }

    public Down(OkHttpClient client) {
        this.client = client;
    }


5、最後整個MyImageDownloader類代碼如下:

 

 

public class MyImageDownloader implements Downloader {
    private static OkHttpClient defaultOkHttpClient() {
        OkHttpClient client = OkHttpUtils.getInstance().getOkHttpClient();
        Log.d("MyOKHttpDownloader", "---->defaultOkHttpClient(): " + client.toString());
        return client;
    }

    private final OkHttpClient client;

    public MyImageDownloader(final File cacheDir, final long maxSize) {
        this(defaultOkHttpClient());
        try {
            client.newBuilder().cache(new okhttp3.Cache(cacheDir,maxSize)).build();
        } catch (Exception ignored) {
        }
    }

    public MyImageDownloader(OkHttpClient client) {
        this.client = client;
    }

    protected final OkHttpClient getClient() {
        return client;
    }

    @Override
    public Response load(Uri uri, int networkPolicy) throws IOException {
        CacheControl cacheControl = null;
        if (networkPolicy != 0) {
            if (NetworkPolicy.isOfflineOnly(networkPolicy)) {
                cacheControl = CacheControl.FORCE_CACHE;
            } else {
                CacheControl.Builder builder = new CacheControl.Builder();
                if (!NetworkPolicy.shouldReadFromDiskCache(networkPolicy)) {
                    builder.noCache();
                }
                if (!NetworkPolicy.shouldWriteToDiskCache(networkPolicy)) {
                    builder.noStore();
                }
                cacheControl = builder.build();
            }
        }

        okhttp3.Request.Builder builder = new okhttp3.Request.Builder().url(uri.toString());
        if (cacheControl != null) {
            builder.cacheControl(cacheControl);
        }

        okhttp3.Response response = client.newCall(builder.build()).execute();
        int responseCode = response.code();
        if (responseCode >= 300) {
            response.body().close();
            throw new ResponseException(responseCode + " " + response.message(), networkPolicy,
                    responseCode);
        }

        boolean fromCache = response.cacheResponse() != null;

        ResponseBody responseBody = response.body();
        return new Response(responseBody.byteStream(), fromCache, responseBody.contentLength());
    }

    @Override
    public void shutdown() {
        Cache cache = client.cache();
        if (cache != null) {
            try {
                cache.close();
            } catch (IOException ignored) {
            }
        }
    }
}

 

 

 

 

 

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