使用此静态方法在 sdcard/internal storage 中创建一个目录。
/**
* Cache class to create dir, save, retrieve and delete files
* File names are hashCode of the url json is downloaded from.
**/
public class FileCache {
static File cacheDir;
static final String DIRECTORY_ADDRESS = "/Android/data/<app_package>/.<directory name>";
public static createDirectory(Context context){
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(Environment.getExternalStorageDirectory(),DIRECTORY_ADDRESS);
else
cacheDir=context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
}
public static File getFile(String url){
String filename=String.valueOf(url.hashCode());
File f = new File(cacheDir, filename);
return f;
}
public static void saveFile(InputStream is, File file){
try {
OutputStream os = new FileOutputStream(file);
copyStream(is, os);
os.close();
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
}
/**
* Clear all files at app uninstall or application or on
* low memory or some other event, using a boradcastreceiver/alarmmanager
**/
public static void clear(){
File[] files=cacheDir.listFiles();
if(files==null)
return;
for(File f:files)
f.delete();
}
}
现在在应用程序启动时创建目录:
FileCache.createDirectory(context);
设置完成后,您必须使用 AsyncTask 获取 JSONArray,并将其存储在文件中
/**
* Add this in doinBackground()
**/
private File getJson(Stirng url) {
File f = FileCache.getFile(url);
if(f != null && f.isFile()) {
//file exists in directory, no need to download.
return f;
}
try {
URL fileUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) fileUrl.openConnection();
conn.setConnectTimeout(120000);
conn.setReadTimeout(120000);
conn.setInstanceFollowRedirects(true);
InputStream is = conn.getInputStream();
FileCache.saveFile(is, f);
return f;
} catch (Exception ex) {
return null;
}
}
现在您必须在每次需要加载数据并将数据绑定到列表视图时运行此线程。我排除了如何从文件中解析 json 并将其转换为适配器的 List 的详细信息。
如果文件中不可用,此 AsyncTask 将自动获取数据,并在 onPostExecute() 中加载到列表视图中。因此,从第二次开始,它不会花费太多时间,并且数据将被持久化存储。您也可以在ListView中添加分页,即如果您有1000个json哈希,您可以从这个文件中批量读取数据,这也是一个很好的优化。
现在,每当数据更新(每月/每周)时,使用 GCM 发送推送通知,运行服务,使用 FileCache.clear() 清除旧文件,然后从服务启动此 AsyncTask,所有这些都在后台,因此如果之后打开应用程序,您将从文件存储中获取更新的数据。
把所有东西都放在 sqlite 中是一个类似的选择,然后你必须使用 DbAdapters、CursorLoaders 和 CursorAdapters,然后使用服务来更新数据库。
但是由于您没有大型数据集,我认为文件缓存就足够了。
希望对您有所帮助。 :)