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開(kāi)發(fā)自定義雙向SeekBar拖動(dòng)條控件
這篇文章主要為大家介紹了Android開(kāi)發(fā)自定義雙向SeekBar拖動(dòng)條控件使用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Android獲取當(dāng)前運(yùn)行的類名或者方法
這篇文章主要介紹了Android獲取當(dāng)前運(yùn)行的類名或者方法,涉及Android操作類與方法的技巧,需要的朋友可以參考下2015-05-05Android中的Selector的用法詳解及實(shí)例
這篇文章主要介紹了Android中的Selector的用法詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05Android內(nèi)置SQLite的使用詳細(xì)介紹
這篇文章主要介紹了Android內(nèi)置SQLite的使用詳細(xì)介紹,文章通過(guò)文章展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Android Listview中顯示不同的視圖布局詳解及實(shí)例代碼
這篇文章主要介紹了Android Listview中顯示不同的視圖布局詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02Flutter沉浸式狀態(tài)欄/AppBar導(dǎo)航欄/仿咸魚底部凸起導(dǎo)航欄效果
這篇文章主要介紹了Flutter沉浸式狀態(tài)欄/AppBar導(dǎo)航欄/仿咸魚底部凸起導(dǎo)航欄效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04Android?studio實(shí)現(xiàn)單選按鈕
這篇文章主要為大家詳細(xì)介紹了Android?studio實(shí)現(xiàn)單選按鈕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Android Textview實(shí)現(xiàn)顏色漸變滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android Textview實(shí)現(xiàn)顏色漸變滾動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10