如果第二次加载同一页面,请避免从服务器获取数据

时间:2013-05-24 12:58:18

标签: android

我的应用程序以这种方式工作:

  

的ListView ----> onListItemClick ----> detailspage ----> backpressed ---->去   返回列表---->再次点击同一项目---->相同的详细信息页面   再次加载。

详细信息页面从服务器获取大量数据并填充其视图。

因此,每次在列表视图中单击一个项目时,它需要2-4秒。我已经看过如果第二次调用同一页面,他们不会加载任何数据的应用程序。

我该怎么做?

目前在我的应用中就是这样:

  

onCreate调用AsyncTask来获取数据并填充视图

     

onResume,onPause,onStart,onStop,onDestroyed

中没有任何内容

1 个答案:

答案 0 :(得分:0)

您可以将该域对象的数据保存为单个,然后在您输入详细信息页面时,有两种方法可以使用。

例如,如果你有一个Person类列表。

public class Person {
    private String name;
    private Image img;
    ...
}

然后你可以拥有一个PersonCache,它是一个单例缓存列表中所选最后一个Person的数据:

public class PersonCache {
    private Person cachedPerson;
    private static PersonCache instance;

    private PersonCache(){
        ...
    }

    public PersonCache getInstance(){
        if(instance == null){
            instance = new PersonCache();
        }
        return instance;
    }

    public Person getCachedPerson(){
       return cachedPerson;
    }

    public void setCachedPerson(Person p){
        cachedPerson = p;
    }

}

因此,在onCreate完成提取JSON数据后,您需要创建一个Person对象并调用setCachedPerson

如果您知道详细信息页面中的数据尚未更新 在详细信息页面的onCreate中,检查已选择的对象是否与单例中缓存的对象相同(如果对象在数据库中具有唯一ID,则可以查看这些对象以检查它是否相同) 。

如果您不知道是否有新数据 在AsyncTask中发出GET请求时,可以使用 If-Modified-Since 技术。

基本上你要做的是添加一个header参数 key:If-Modified-Since 价值:1994年10月29日星期六19:43:31 GMT

如果服务器没有新数据,它可以使用304进行回复,并且不会发送任何响应正文,但如果它有新数据,它将使用200进行响应,并像正常情况一样发送数据。

实现这一点也需要在服务器端进行一些实现。 以下是有关该技术的更多信息: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html(第14.25节)