黑馬程式----關於非同步與讀取本地檔案
阿新 • • 發佈:2019-01-26
今天在做一個app的時候出現了一個問題,資料是從網路服務端讀取的,可是app每次
啟動的時候都從網路獲取資源的話會消耗大量的資源,也顯得程式不是那麼的和諧。上網查了查這方面的
資料,能想對應的東西不是很多,於是自己就寫了個簡單的程式,也沒進行優化什麼的。
1第一次進入程式的時候讀取網路,把資源json寫成txt檔案儲存在sd卡里面。【也有寫成xml或者儲存在sqlite資料庫的】
2再次讀取的時候先判斷本地的 txt檔案是否存在,
3要是本地的txt檔案存在,判斷檔案時候 “過期” 然後讀取本地的txt檔案然後 解析json展示資料
4.要是檔案不存在或者檔案過期的話,則讀取網路資料,然後儲存txt檔案。
// 讀取txt檔案的函式 private String loadTextFile(InputStream inputStream) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] bytes = new byte[4096]; int len = 0; while ((len = inputStream.read(bytes)) > 0) { byteArrayOutputStream.write(bytes, 0, len); } return new String(byteArrayOutputStream.toByteArray(), "UTF8"); } // public String readFileSdcard(String fileName) { String res = ""; try { FileInputStream fin = new FileInputStream(fileName); int length = fin.available(); byte[] buffer = new byte[length]; fin.read(buffer); res = EncodingUtils.getString(buffer, "UTF-8"); fin.close(); } catch (Exception e) { e.printStackTrace(); } return res; } // public static String readFile(String fileName) throws IOException { File file = new File(fileName); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024); FileInputStream inputStream = new FileInputStream(file); int len = 0; byte[] buffer = new byte[1024]; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } outputStream.close(); inputStream.close(); byte[] data = outputStream.toByteArray(); return new String(data); }
public static final int CONFIG_CACHE_SHORT_TIMEOUT = 1000 * 60 * 30; // 30 // 分鐘 // 驗證快取是否過期的函式 public boolean IsoutTime(String filename) { File files = new File("mnt/sdcard/" + filename); // if (files.exists() && files.isFile()) { long expiredTime = System.currentTimeMillis() - files.lastModified(); if (expiredTime > CONFIG_CACHE_SHORT_TIMEOUT) { return true; // 過期了。 } else { return false;// 沒過期。 } }
下面是非同步。
private class TextAsyncTask extends AsyncTask<String, Integer, Void> {
/*
* TextAsyncTask(String params) {
*
* }
*/
@Override
protected void onPreExecute() {
}
@Override
protected Void doInBackground(String... params) {
newslist1 = new ArrayList<NewsEntity>();
newslist1 = getText(params[0], newslist1);
newsList = newslist1;
return null;
}
@Override
protected void onPostExecute(Void result) {
switch (getNewsReturnValue) {
case 1:
Toast.makeText(MainTow.this, "1", Toast.LENGTH_LONG).show();
getNewsReturnValue = 0;
break;
case 2:
Toast.makeText(MainTow.this, "2", Toast.LENGTH_LONG).show();
getNewsReturnValue = 0;
break;
case 3:
Toast.makeText(MainTow.this, "3", Toast.LENGTH_LONG).show();
getNewsReturnValue = 0;
break;
case 4:
Toast.makeText(MainTow.this, "4", Toast.LENGTH_LONG).show();
getNewsReturnValue = 0;
break;
default:
getNewsReturnValue = 0;
break;
}
bb.notifyDataSetChanged();
}
}
//讀取json資料解析成模具類
private ArrayList<NewsEntity> getText(String filename,
ArrayList<NewsEntity> newslist1) {
String requestResult = " ";
requestResult = readFileSdcard("mnt/sdcard/" + filename + ".txt");
if (requestResult == null) {
Toast.makeText(getApplicationContext(), "讀取失敗", 1).show();
}
if (requestResult.equals("RESPONSEERROR")) {
getNewsReturnValue = 3;
} else if (!requestResult.equals("RESPONSENULL")) {
newslist1 = HttpOperation.getObjectFromWebService(requestResult,
newslist1);
int newNum = newslist1.size();
if (newslist1.isEmpty()) {
getNewsReturnValue = 1;
}
} else {
getNewsReturnValue = 4;
}
return newslist1;
}