1. 程式人生 > >Okhttp和Picasso配合使用外加ACache實現快取

Okhttp和Picasso配合使用外加ACache實現快取

app開發對於網路請求是整個專案的一大塊,對於新開的專案的新需求我也打算換一套框架試試。以前用的google官方的volley,現在想試一下其他的。volley確實很方便,但是對https這塊需要我們手動改volley原始碼。所以果斷選擇okhttp,為了更長遠的打算。
Okhttp和Picasso採用了同樣的設計模式— 建造者模式【Builder Pattern】 ,詳見http://blog.csdn.net/ysq5202121/article/details/7407350 通過鏈式程式設計,一行程式碼實現所有操作,精簡明瞭。

準備工作:

    compile 'com.zhy:okhttputils:2.5.1'
compile 'com.squareup.picasso:picasso:2.5.2'

對Okhttp簡單是二次封裝:

public class RequestManager {
    private static  RequestManager reqManager;

    public static RequestManager getInstance(Context context) {
        if (reqManager == null) {
            synchronized (RequestManager.class) {
                if
(reqManager == null) { reqManager = new RequestManager(); return reqManager; } } } return null; } /** * 基本的post請求 * @param url * @param params * @param clazz * @param callback * @param
<T> */
public static <T> void sendPost(String url, Map<String, String> params, final Class<T> clazz, Callback<T> callback){ OkHttpUtils .post() .url(url) .headers(initHeader(params)) .params(params) .build() .execute(callback); } /** * 基本的檔案上傳 * @param url * @param file * @param callback */ public static void uploadFile(String url, File file,Callback callback){ OkHttpUtils .postFile() .url(url) .file(file) .build() .execute(callback); } }

Picasso的簡單使用:

/**
 * Created by rongtao on 2016/5/26.
 * 二次封裝picasso實現網路圖片的載入
 */
public class APIImageLoader {
    /**
     * 顯示網路圖片
     * @param context
     * @param url  圖片路徑
     * @param defResValue 預設佔位圖片
     * @param errorValue  錯誤佔位圖片
     * @param imageView  顯示控制元件
     */
     public static void displayImage(Context context, String url, int defResValue, int errorValue , ImageView imageView){
         Picasso.with(context)
                 .load(url)
                 .placeholder(defResValue)
                 .error(errorValue)
                 .into(imageView);
     }
}

Acache本地快取處理:
Acache下載https://yunpan.cn/cRHRXCfhWR9mY 訪問密碼 6d6a

下面的這個二次封裝的類來自我的朋友百度大牛–Mr.Zhao

/**
 * Created by zhaokai on 2016-05-15
 * @e-mail [email protected]
 *
 * 資料儲存
 * 用於頁面跳轉大資料 或者複雜資料的 轉接
 * 用於快取資料到本地
 * 用於儲存程式執行時常用資料
 *
 * 儲存
 * DataCache.setToCache("123",456);
 * ModelUser user = new ModelUser();
 * user.setName("haha");
 * DataCache.setToCache("ev",user);
 *
 * 獲取
 * Integer i = DataCache.getFromCache(123+"",Integer.class);
 * ModelUser user = (DataCache.getFromCache("ev",ModelUser.class));
 *
 */
public class DataCache {

    /**
     * App 執行長久快取
     */
    private static HashMap<String,Object> cacheLong = new HashMap<>();
    private File cacheFile;


    /**
     * App執行臨時快取
     */
    private final LruCache<String, Object> cache;
    private DataCache() {
        cache = new LruCache<>(50);
        cacheFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "dir"+File.separator+"cache");
        if (!cacheFile.exists()) {
            cacheFile.mkdirs();
        }
    }

    private static DataCache dataCache ;

    private static DataCache getInstance() {
        if (dataCache == null){

            dataCache = new DataCache();
        }
        return dataCache;
    }

    /**
     * 從資料快取中獲取 此資料不會自動清空
     * @param key       資料索引
     * @param clazz     類檔案
     * @return          需要的類
     */
    public static <T> T getFromStore(String key,Class<T> clazz){
        return getInstance().getFromStoreIml(key,clazz);
    }

    private <T> T getFromStoreIml(String key, Class<T> clazz) {

        Object obj = null;
        if(cacheLong!=null){
            obj = cacheLong.get(key);
        }

//        LogUtil.e("DataCache",obj.getClass().getSimpleName());
//        LogUtil.e("DataCache",clazz.getSimpleName());

        if(obj!=null&&clazz.getSimpleName().equals(obj.getClass().getSimpleName())){
            return (T)obj;
        }
        return null;
    }


    /**
     * 移除臨時快取
     * @param key
     */
    public static void removeFromCache(String key) {
        getInstance().removeFromCacheImp(key);
    }

    private void removeFromCacheImp(String key) {
        cache.remove(key);
    }

    /**
     * App 執行期間快取資料
     * @param key           資料索引
     * @param value         資料值
     * @return              同一key 值的其他索引
     *
     */
    public static <V> V setToStore(String key,V value){
        return getInstance().setToStoreIml(key,value);
    }

    private <V> V setToStoreIml(String key, V value) {
        Object obj = null;
        if(cacheLong!=null){
            obj = cacheLong.put(key,value);
        }
        return obj==null||!obj.getClass().getSimpleName().equals(value.getClass().getSimpleName())?null: ((V) obj);
    }

    /**
     * 從長久快取中移除 資料
     * @param key       資料的key 值
     * @return          是否存在並移除
     */
    public static boolean removeFromStore(String key){
        Object obj = cacheLong.remove(key);
        return obj==null;
    }

    /**
     * 清空長久快取
     */
    public static void clearLongCache(){
        getInstance().clearLongCacheIml();
    }

    private void clearLongCacheIml() {
        cacheLong.clear();
    }

    /**
     * 清空短期快取
     */
    public static void clearCache(){
        getInstance().clearCacheIml();
    }

    private void clearCacheIml() {
        cache.evictAll();
    }


    /**
     * 從快取中獲取資料
     * @param key 要獲取資料的key值
     *
     * @return 返回資料
     */
    public static <T> T getFromCache(String key,Class<T> clazz) {

        return getInstance().getFromCacheIml(key,clazz);
    }

    public static String getString(String key){
        return getInstance().getFromCacheIml(key,String.class);
    }

    public <T> T getFromCacheIml(String key,Class<T> T) {

        T obj ;
        if(key !=null){
            try {
                obj = ((T) cache.get(key));
                return obj;
            }catch (Exception e){
                Log.e("DataCache",e.toString());
            }
        }
        return null;
    }

    /**
     * 儲存鍵值對到快取
     * @param key       獲取資料的key值
     * @param value     儲存的值
     *
     * @return          之前存放的值
     */
    public static <V> V setToCache(String key,V value){
        return getInstance().setToCacheIml(key,value);
    }

    public static String setString(String key,String value){
        return getInstance().setToCacheIml(key,value);
    }
    public <V> V setToCacheIml(String key,V value) {
        if (key == null || value == null) {
            throw new NullPointerException("key == null || value == null");
        }
        try {
            Object obj = cache.put(key,value);
            return obj==null||!obj.getClass().getSimpleName().equals(value.getClass().getSimpleName())?null: ((V) obj);
        }catch (Exception e){
            Log.e("DataCache",e.toString());
        }
        return null;
    }


    /**
     * 儲存JSON 到本地
     * @param key       檔案索引
     * @param json      JSON資料
     */
    public static void saveToLocal(String key,String json){
        getInstance().saveToLocalImp(key,json,dataCache.cacheFile);
    }

    /**
     * 儲存JSON 到本地
     * @param key       檔案索引
     * @param json      JSON資料
     * @param cacheFile 快取目錄
     */
    public static void saveToLocal(String key, String json, File cacheFile) {
        getInstance().saveToLocalImp(key,json,cacheFile);
    }

    private void saveToLocalImp(String key, String json, File cacheFile){
        ACache aCache = ACache.get(cacheFile);
        aCache.put(key,json);
    }

    /**
     * 從本地獲取快取資料
     * @param key       檔案索引
     * @param cacheFile 快取目錄
     * @return          快取資料
     */
    public static String getFromLocal(String key, File cacheFile){
        return getInstance().getFromLocalImp(key,cacheFile);
    }
    /**
     * 從本地獲取快取資料
     * @param key       檔案索引
     * @return          快取資料
     */
    public static String getFromLocal(String key){
        return getInstance().getFromLocalImp(key,dataCache.cacheFile);
    }
    private String getFromLocalImp(String key, File cacheFile){
        ACache aCache = ACache.get(cacheFile);
        return aCache.getAsString(key);
    }



    /**
     * 快取其他型別的資料到本地
     * @param key       索引
     * @param value     繼承自Serializabe的module
     */
    public static <V extends Serializable> void saveToLocal(String key, V value){
        getInstance().saveToLocalImp(key,value);
    }
    public <V extends Serializable> void saveToLocalImp(String key, V value){
        ACache aCache = ACache.get(cacheFile);
        aCache.put(key,value);
    }

    /**
     * 快取其他型別的資料到本地
     * @param key       索引
     */
    public static <T extends Serializable> T getFromLocal(String key,Class<T> clazz){
        return getInstance().getFromLocalImp(key,clazz);
    }
    public <T extends Serializable> T getFromLocalImp(String key,Class<T> clazz){
        ACache aCache = ACache.get(cacheFile);
        Object obj;
        obj = aCache.getAsObject(key);
        Log.e("DataCache","clazz = "+clazz.getSimpleName());
        if(obj !=null&&clazz.getSimpleName().equals(obj.getClass().getSimpleName())){
            try {
                return ((T) obj);
            }catch (Exception e){
                Log.e("DataCache","Exception = "+e.toString());
            }
        }
        return null;
    }
}

這個三個類在網路請求這一塊基本可以獨擋一面了。

Okhttp想扒的更多可以去看鴻洋大神的github:
https://github.com/hongyangAndroid/okhttp-utils
Picasso可以去它的官網:
http://square.github.io/picasso/

這也就是我這一週的收貨吧,分享給大家。

不會敲程式碼沒關係,要懂得粘程式碼(CV大法,開發必備)。