android對象緩存,Android簡單實現 緩存數據

前言

1、每一種要緩存的數據都是有對應的versionCode,通過versionCode請求網絡獲取是否需要更新

2、提前將要緩存的數據放入assets文件夾中,打包上線。

緩存設計

6b01a1dcb26662ccdd0223b83c644aaa.png

代碼實現

/**

* Created by huangbo on 2017/6/19.

*

* 主要是緩存的工具類

*

* 緩存設計:

* 0.從內存中讀取數據 :0.1 讀取成功-> 取出versionCode ->3

* 0.2 讀取失敗-> 1

*

* 1.從文件中讀取數據:1.1讀取成成功-> 取出versionCode ->3

* 1.2讀取失敗-> 2

* 2.從Assets中讀取數據:2.1讀取成功-> 取出versionCode ->3

* 2.2讀取失敗-> versionCode==0 ->3

*

* 3.用versionCode請求網絡 3.1請求成功(有版本更新)將文件寫入內存,寫入文件;

* 3.1 請求失敗,(沒有版本更新)

*

*/

public class CacheData {

public static CacheData cacheData;

public static CacheData getInstance() {

if (cacheData == null) {

cacheData = new CacheData();

}

return cacheData;

}

String mFileName;

public CacheData cacheName(String mFileName) {

this.mFileName = mFileName;

return this;

}

ExecutorService cachedThreadPool;

private CacheData() {

cachedThreadPool = Executors.newCachedThreadPool();

}

/**

* 從assets 中讀取文件

*

* @return cacheData 的Json串

*/

private String readDataFromAssets() {

try {

InputStream ips = AppUtils.ApplicationContext.getAssets().open(mFileName);

byte[] bytes = new byte[ips.available()];

ips.read(bytes);

ips.close();

return new String(bytes);

} catch (IOException e) {

e.printStackTrace();

}

return "";

}

public void readDataFromAssets(final Handler handler) {

cachedThreadPool.execute(new Runnable() {

@Override

public void run() {

String json = readDataFromAssets();

Message message = handler.obtainMessage(1, json);

handler.sendMessage(message);

}

});

}

public void readDataFromFile(final Handler handler) {

cachedThreadPool.execute(new Runnable() {

@Override

public void run() {

Message message = handler.obtainMessage(1, readDataFromFile());

handler.sendMessage(message);

}

});

}

/**

* 將region 更新到指定文件里

* @param

*/

public void writeData2FileWithThread(final String Data) {

cachedThreadPool.execute(new Runnable() {

@Override

public void run() {

writeRegion2File(Data);

}

});

}

/**

* @return cacheData 的Json串

*/

private String readDataFromFile() {

try {

File file = new File(AppUtils.getCacheDirectory(), mFileName);

if (!file.exists()) {

return null;

}

FileInputStream fis = new FileInputStream(file);

byte[] bytes = new byte[fis.available()];

fis.read(bytes);

fis.close();

return new String(bytes);

} catch (IOException e) {

e.printStackTrace();

}

return "";

}

private void writeData2File(String jsonData) {

try {

File cityFile = new File(AppUtils.getCacheDirectory(), mFileName);

if (!cityFile.exists()) {

cityFile.createNewFile();

}

FileOutputStream fos = new FileOutputStream(cityFile);

fos.write(regionJsonData.getBytes("UTF-8"));

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

使用方法

/**

* Created by huangbo on 2017/6/8.

*/

public class Region {

public static Region region;

public static Region getInstance() {

if (region == null) {

region = new Region();

}

return region;

}

ProvinceCityBean provinceCityBean;

public int getVersion() {

return provinceCityBean == null ? 0 : provinceCityBean.getVersion();

}

public ProvinceCityBean getProvinceCityBean() {

return provinceCityBean;

}

public void setProvinceCityBean(final String mRegionJson, final Handler handler) {

if (TextUtils.isEmpty(mRegionJson)) {

return;

}

cachedThreadPool.execute(new Runnable() {

@Override

public void run() {

provinceCityBean = GsonUtils.GsonToBean(mRegionJson, ProvinceCityBean.class);

if (handler != null) {

handler.sendEmptyMessage(1);

}

}

});

}

ExecutorService cachedThreadPool;

CacheData cacheData;

private Region() {

cachedThreadPool = Executors.newCachedThreadPool();

cacheData = CacheData.getInstance().cacheName(Const.REGION_JSON);

}

/**

* 具體調用方法

*/

public void cacheRegion() {

if (provinceCityBean == null) {

readRegionFromFile();

} else {

readRegionFromHttp();

}

}

private void readRegionFromFile() {

cacheData.readDataFromFile(new Handler() {

@Override

public void handleMessage(Message msg) {

String jsonRegion = (String) msg.obj;

onReadRegionFromFileBack(jsonRegion);

}

});

}

/**

* 從文件中讀取數據,若為null 繼續從Asset中獲取

*

* @param jsonRegion

*/

private void onReadRegionFromFileBack(String jsonRegion) {

if (!TextUtils.isEmpty(jsonRegion)) {/*文件中讀取成功 設置到Region中更新json 取出version請求網絡判斷是否為最新的版本 */

setProvinceCityBean(jsonRegion, httpHandler);

} else {/*文件中讀取失敗 從assets 中繼續讀取*/

cacheData.readDataFromAssets(new Handler() {

@Override

public void handleMessage(Message msg) {

String jsonRegion = (String) msg.obj;

onReadRegionFromAssetsBack(jsonRegion);

}

});

}

}

private void onReadRegionFromAssetsBack(String jsonRegion) {

if (!TextUtils.isEmpty(jsonRegion)) {/*從assets中讀取成功 設置到Region中更新json*/

setProvinceCityBean(jsonRegion, httpHandler);

} else {

readRegionFromHttp();

}

}

private void readRegionFromHttp() {

ReqRegion reqRegion = new ReqRegion();

reqRegion.sendRequest(false, new OnHttpResult() {

@Override

public void onHttpSuccess(String data) {

setProvinceCityBean(data, null);

cacheData.writeData2FileWithThread(data);

}

@Override

public void onHttpFailure(String message) {

}

});

}

Handler httpHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

readRegionFromHttp();

}

};

}

Region.getInstance().cacheRegion();//實現緩存

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378261.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378261.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378261.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通信原理.緒論

今天剛上通信原理的第一節課,沒有涉及過多的講解,只是講了下大概的知識框架。現記錄如下: 目錄1、基本概念消息、信息與信號2、通信系統模型1、信息源2、發送設備3、信道4、接收設備5、信宿6、模擬通信系統模型7、數字通信系統模型8、信源編…

Android版本演進中的兼容性問題

原文:http://android.eoe.cn/topic/summary Android 3.0 的主要變化包括: 不再使用硬件按鍵進行導航 (返回、菜單、搜索和主屏幕),而是采用虛擬按鍵 (返回,主屏幕和最近的應用)。在操作欄固定菜單。 Android 4.0 則把這些變化帶到了手機平臺。…

css rgba透明_rgba()函數以及CSS中的示例

css rgba透明Introduction: 介紹: Functions are used regularly while we are developing a web page or website. Therefore, to be a good developer you need to master as many functions as you can. This way your coding knowledge will increase as well …

第十七章 擴展Python

第十七章 Python什么都能做,真的是這樣。這門語言功能強大,但有時候速度有點慢。 魚和熊掌兼得 本章討論確實需要進一步提升速度的情形。在這種情況下,最佳的解決方案可能不是完全轉向C語言(或其他中低級語言)&…

android studio資源二進制,無法自動檢測ADB二進制文件 – Android Studio

我嘗試在Android Studio上測試我的應用程序,但我遇到了困難"waiting for AVD to come online..."我讀過Android設備監視器重置adb會做到這一點,它確實……對于1次測試,當我第二天重新啟動電腦時,我不僅僅是:"waiting for AVD to come online..."…

犀牛腳本:仿迅雷的增強批量下載

迅雷的批量下載滿好用。但是有兩點我不太中意。在這個腳本里會有所增強 1、不能設置保存的文件名。2、不能單獨設置這批下載的線程限制。 使用方法 // 下載從編號001到編號020的圖片,保存名為貓咪寫真*.jpg 使用6個線程 jdlp http://bizhi.zhuoku.com/bizhi/200804/…

為什么使用1 * 1 的卷積核

為什么使用 1* 1卷積核? 作用: 1、實現跨通道的交互和信息整合 2、 進行卷積核通道數的降維和升維 3、 在保持feature map尺度不變的(即不損失分辨率)的前提下大幅增加非線性特性 跨通道的交互和信息整合 使用1 * 1卷積核&a…

KingPaper初探ThinkPHP3.1.2之擴展函數庫和類庫的使用(四)

在我們做項目的時候TP的系統函數或系統類庫滿足不了我們的需要 所以有些東西需要我們自己去定義,在TP中我們怎么使用自己的函數庫和類庫呢?在TP系統中提供了三個系統函數庫 common.php是全局必須加載的基礎函數庫,在任何時候都可以直接調用&a…

isfinite函數_isfinite()函數以及C ++中的示例

isfinite函數C isfinite()函數 (C isfinite() function) isfinite() function is a library function of cmath header, it is used to check whether the given value is a finite value or not? It accepts a value (float, double or long double) and returns 1 if the v…

android 服務端 漏洞,安卓漏洞 CVE 2017-13287 復現詳解-

2018年4月,Android安全公告公布了CVE-2017-13287漏洞。與同期披露的其他漏洞一起,同屬于框架中Parcelable對象的寫入(序列化)與讀出(反序列化)的不一致所造成的漏洞。在剛看到谷歌對于漏洞給出的補丁時一頭霧水,在這里要感謝heeeeenMS509Team…

某公司面試題

一、基礎題 1,馮諾依曼結構的計算機硬件邏輯組成中,不包含以下哪個模塊? A,編譯器 B,控制器 C,輸入設備 D,輸出設備 解釋:馮諾依曼由五個模塊組成:輸入設備 輸出設備 存…

GAP(全局平均池化層)操作

轉載的文章鏈接: 為什么使用全局平均池化層? 關于 global average pooling https://blog.csdn.net/qq_23304241/article/details/80292859 在卷積神經網絡的初期,卷積層通過池化層(一般是 最大池化)后總是要一個或n個全…

zoj1245 Triangles(DP)

/* 動態三角形&#xff1a;每次DP時考慮的是兩個子三角形的高度即可 注意&#xff1a; 三角形可以是倒置的。 */ View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <stdio.h> 5 6 using namespace std; 7 8…

第十八章 程序打包

第十八章 程序打包 Setuptools和較舊的Distutils都是用于發布Python包的工具包&#xff0c;能夠使用Python輕松地編寫安裝腳本。這些腳本可用于生成可發布的歸檔文檔&#xff0c;供用戶用來編譯和安裝編寫庫。 Setuptools并非只能用于創建基于腳本的Python安裝程序&#xff0…

如何在Java中檢查對象是否為空?

With the help of "" operator is useful for reference comparison and it compares two objects. 借助“ ”運算符&#xff0c;對于參考比較非常有用&#xff0c;它可以比較兩個對象。 "" operator returns true if both references (objects) points to…

android編程從零開始,從零開始學習android開發

博主最近開通了Android欄目&#xff0c;現在正在從零開始學習android&#xff0c;遇到的所有值得分享的知識點以及遇到的問題將發布在這個博客的android欄目下。因為我有著深厚的java底子&#xff0c;所以學習起來得心應手&#xff0c;十分的簡單&#xff0c;當然也只能算是入門…

CNN基本步驟以及經典卷積(LeNet、AlexNet、VGGNet、InceptionNet 和 ResNet)網絡講解以及tensorflow代碼實現

課程來源&#xff1a;人工智能實踐:Tensorflow筆記2 文章目錄前言1、卷積神經網絡的基本步驟1、卷積神經網絡計算convolution2、感受野以及卷積核的選取3、全零填充Padding4、tf描述卷積層5、批標準化(BN操作)6、池化Pooling7、舍棄Dropout8、卷積神經網絡搭建以及參數分析2、經…

String.valueOf()

1. 由 基本數據型態轉換成 String String 類別中已經提供了將基本數據型態轉換成 String 的 static 方法 也就是 String.valueOf() 這個參數多載的方法 有下列幾種 String.valueOf(boolean b) : 將 boolean 變量 b 轉換成字符串 String.valueOf(char c) : 將 char 變量 c 轉換成…

emacs gdb 調試

寫下linux下用emacs調用dgb調試的方法 emacs中使用gdb 說明C等價于ctrl M等價于alt 1,編寫 .c函數 test.c 2&#xff0c;gcc一把 看看對不對 帶上-g gcc -g -o test .debug test.c 如果要用gdb調試器&#xff0c;必須使用g選項。 3&#xff0c;#ema…

第十九章 趣味編程

第十九章 趣味編程 本章將介紹一些通用的Python編程指南。 為何要有趣 Python有趣的地方之一就是讓用戶的編程效率非常高效。 極限編程是一種軟件開發方法 編程柔術 python的靈活性描述原型設計Python的優點之一是讓你能夠快速地編寫程序。要更深入地了解面臨的問題&#…