0

美好的一天,抱歉这篇文章太长了。这更像是一个设计决定,而不是其他任何事情。我有一个包含 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;
    }
}
  1. 在我的片段中,我在 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);
        }
    
      }
    }
    

    对我来说,这感觉像是一种处理这种情况的混乱方式。考虑到应用程序崩溃和活动生命周期,这是一个很好的解决方案,或者我可以用更优雅的方式来实现这一点吗?每一个输入将不胜感激。谢谢

4

1 回答 1

0

1.首先你需要创建数据结构来保存片段的数据

  1. 检查数据结构中数据是否可用于选定的片段,如果是,则该刷新数据了,然后调用加载数据(加载数据的 Web 服务)到片段中,否则从数据结构中加载数据并显示在片段中。
于 2013-07-10T17:55:04.837 回答