Okhttp和Picasso配合使用外加ACache實現快取
阿新 • • 發佈:2018-12-21
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大法,開發必備)。