美好的一天,抱歉这篇文章太长了。这更像是一个设计决定,而不是其他任何事情。我有一个包含 4 个片段的活动。现在我通过幻灯片菜单切换片段。每个 Fragment 调用 Web 服务并通过 AsyncTask 获取 JSONObject 结果。我正在寻找一种结构,我必须为每个片段缓存每个 JSONObject 结果。当用户在分片之间切换时,它会检查是否已经过了一定的时间并采取相应的行动
- 如果缓存时间已过,重新加载网络请求。- 如果没有,则使用缓存的 JSONObject 结果并显示给用户。
这意味着如果我有一个 6 小时的过期时间,或者更确切地说来自后端的数据每 6 小时更新一次,我应该每 6 小时通过 asynctask 从 web 服务请求一次,而其他时间只使用缓存的值。
我当前的实现 1. 通过扩展 Application 类来获得一组全局布尔变量,以便第一次为每个片段加载。
public class MyApp extends Application {
private boolean First_load_frag1 = true;
private boolean First_load_frag2= true;
public void setLoadFrag1(boolean value){
First_load_frag1 = value;
}
public boolean getLoadFrag1(){
return First_load_frag1;
}
}
在我的片段中,我在 onCreate() 中将它们设置为 true,使用它来确定是否第一次请求,然后将其设置为 false,这样我就不必再这样做了。然后在我的片段 OnResume() 中,我检查 cached_time 是否已过期。我做这样的事情
@Override public void onResume(){ super.onResume(); public final static long MINUTE_MILLIS = 60000;
Calendar cal = Calendar.getInstance(); int mins = (int) ((cal.getTimeInMillis()/MINUTE_MILLIS) - (cached_timer/MINUTE_MILLIS); if(mins > 180){ Toast.makeText(getActivity(), "on resume refresh data", Toast.LENGTH_LONG).show(); requestService(); //this sends a request to the webservice } else { cached_result = manager.getCachedJSONResult(CACHED_RESULT ); if(cached_result != null){ Toast.makeText(getActivity(), "on resume cached data", Toast.LENGTH_LONG).show(); loadCachedResult(cached_result); } } }
对我来说,这感觉像是一种处理这种情况的混乱方式。考虑到应用程序崩溃和活动生命周期,这是一个很好的解决方案,或者我可以用更优雅的方式来实现这一点吗?每一个输入将不胜感激。谢谢