Okhttp和Picasso配合使用

来源:互联网 发布:霓虹灯效果图制作软件 编辑:程序博客网 时间:2024/05/22 10:54

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


0 0
原创粉丝点击