Android簡(jiǎn)單實(shí)現(xiàn) 緩存數(shù)據(jù)
前言
1、每一種要緩存的數(shù)據(jù)都是有對(duì)應(yīng)的versionCode,通過(guò)versionCode請(qǐng)求網(wǎng)絡(luò)獲取是否需要更新
2、提前將要緩存的數(shù)據(jù)放入assets文件夾中,打包上線。
緩存設(shè)計(jì)

代碼實(shí)現(xiàn)
/**
* Created by huangbo on 2017/6/19.
*
* 主要是緩存的工具類
*
* 緩存設(shè)計(jì):
* 0.從內(nèi)存中讀取數(shù)據(jù) :0.1 讀取成功-> 取出versionCode ->3
* 0.2 讀取失敗-> 1
*
* 1.從文件中讀取數(shù)據(jù):1.1讀取成成功-> 取出versionCode ->3
* 1.2讀取失敗-> 2
* 2.從Assets中讀取數(shù)據(jù):2.1讀取成功-> 取出versionCode ->3
* 2.2讀取失敗-> versionCode==0 ->3
*
* 3.用versionCode請(qǐng)求網(wǎng)絡(luò) 3.1請(qǐng)求成功(有版本更新)將文件寫入內(nèi)存,寫入文件;
* 3.1 請(qǐng)求失敗,(沒(méi)有版本更新)
*
*/
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);
}
/**
* 具體調(diào)用方法
*/
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);
}
});
}
/**
* 從文件中讀取數(shù)據(jù),若為null 繼續(xù)從Asset中獲取
*
* @param jsonRegion
*/
private void onReadRegionFromFileBack(String jsonRegion) {
if (!TextUtils.isEmpty(jsonRegion)) {/*文件中讀取成功 設(shè)置到Region中更新json 取出version請(qǐng)求網(wǎng)絡(luò)判斷是否為最新的版本 */
setProvinceCityBean(jsonRegion, httpHandler);
} else {/*文件中讀取失敗 從assets 中繼續(xù)讀取*/
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中讀取成功 設(shè)置到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();//實(shí)現(xiàn)緩存
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Android開發(fā)技巧之在a標(biāo)簽或TextView控件中單擊鏈接彈出Activity(自定義動(dòng)作)
a標(biāo)簽以及TextView自動(dòng)識(shí)別的特殊文本(網(wǎng)址、電話號(hào)、Email等),這些都可以通過(guò)單擊來(lái)觸發(fā)不同的動(dòng)作;但如果讀者想在單擊鏈接時(shí)執(zhí)行任意自定義的動(dòng)作,那么將要介紹的一定是你想要的了2013-01-01
Android實(shí)現(xiàn)帶進(jìn)度條的WebView
這篇文章主要介紹了Android實(shí)現(xiàn)帶進(jìn)度條的WebView,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
Android中Handler實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式
本篇文章主要介紹了Android中Handler實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
Android顯示系統(tǒng)SurfaceFlinger詳解
本文詳細(xì)講解了Android顯示系統(tǒng)SurfaceFlinger,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
Android Activity之間相互調(diào)用與傳遞參數(shù)的原理與用法分析
這篇文章主要介紹了Android Activity之間相互調(diào)用與傳遞參數(shù)的原理與用法,較為詳細(xì)的分析了Android組件的構(gòu)成以及Activity的創(chuàng)建、調(diào)用、切換等相關(guān)操作技巧,需要的朋友可以參考下2016-08-08
Android使用animator實(shí)現(xiàn)fragment的3D翻轉(zhuǎn)效果
這篇文章主要為大家詳細(xì)介紹了Android使用animator實(shí)現(xiàn)fragment的3D翻轉(zhuǎn)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android中傳值Intent與Bundle的區(qū)別小結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于Android中傳值Intent與Bundle的區(qū)別,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Android實(shí)現(xiàn)調(diào)用攝像頭拍照并存儲(chǔ)照片
本文主要介紹了如何利用Android調(diào)用攝像頭拍照,并顯示拍照后的圖片到ImageView中,文中的示例代碼講解詳細(xì),感興趣的可以動(dòng)手試一試2022-01-01

