今天在做一个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;
}