0

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

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

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

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

我怎样才能做到这一点?

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

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

onResume、onPause、onStart、onStop、onDestroyed 中没有任何内容

4

1 回答 1

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技术。

基本上你要做的是添加一个标题参数键:If-Modified-Since value: Sat, 29 Oct 1994 19:43:31 GMT

如果服务器没有新数据,它可以响应304并且不发送响应正文,但是如果它有新数据,它将200像正常一样响应并发送数据。

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

于 2013-05-24T13:13:56.097 回答