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) {
            }
        }
    }
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值