3

我正在开发一个 Android 应用程序,并且我想避免在使用相同的额外内容来自同一个 Activity 时重新加载类似的数据。

具体来说,当我启动我的 Activity 'A' 时,我使用这个 extra 从服务器加载远程数据。从这个活动中,我可以用不同的额外功能重新启动“A”等等。

例子 :

A:id1 --> A:id2 --> A:id3

但是,它也可以是我已经加载的额外内容:

A:id1 --> A:id2 --> A:id3 --> A:id1

在这种情况下,我不会再次请求服务器或丢失活动堆栈。

据我了解,“onSaveInstanceState”允许保存一个活动的一个实例,但就我而言,它是同一活动的多个实例(具有不同的附加功能)。

那么,它是管理同一 Activity 的已保存实例状态(捆绑)列表的解决方案吗?或者是其他东西 ?

提前致谢

4

2 回答 2

3

onSaveInstanceState方法未按您描述的方式使用。 看看这个,它是 Activity 类的文档,特别是 Activity Lifecycle 部分。 onSaveInstanceState是当操作系统出于某种原因必须终止 Activity 时调用的方法。它允许您填充一个 Bundle,这将有助于重新创建用户离开的 Activity 的特定实例。通常发生这种情况是因为用户切换到不同的应用程序并且操作系统正在杀死 Activity 以回收内存,但也会发生在屏幕旋转上,因此至少要注意平台的细微差别。

至于您的问题,我要做的是使用数据库来存储从服务器检索到的信息。当你启动一个 Activity 时,你可以先检查数据库中是否存在需要填充该 Activity 的数据。如果是,则从那里加载并显示它,否则进行服务器调用。

这很好,因为数据将在应用程序的多次使用中保持不变。更进一步,如果来自服务器的数据有可能是陈旧的,您可以轻松扩展它以最初显示来自数据库的数据,并触发对数据的异步请求,该数据将在返回时更新 UI 和数据库. 您的用户几乎永远不会处于等待加载的状态,这总是一件好事!

这是一个关于实现 sqlite 数据库的基础知识的好教程。这还将为您提供额外的好处,即在应用程序的单独运行中保存数据。

作为替代方案,如果您真的不需要数据库的持久性或其他特性,并且认为开销不值得,您可以创建一个 Singleton 类来跟踪返回的数据,也许实现它使用应用程序类。重要的是要注意(并带我们完整循环)任何存储此数据的内存方法都应进行管理,onSaveInstanceState以确保如果 Activity 在意外时间被终止,您不会丢失任何数据。

于 2013-02-08T15:29:39.150 回答
0

对于 MattDavis 的回答 +1,但我也建议您使用所谓的“单例模式”。

本质上,这是一种在内存中缓存事物的方法。您创建了一个类,其目的是保存您不想继续重新加载的所有数据库数据。此对象有一个全局实例,最初为空。您调用一个返回该实例的静态方法。如果静态方法发现实例为空,它会创建实例,从数据库中填充它,缓存它,然后将它返回给调用者。从那时起,对实例的所有请求都只返回缓存的副本。如果您的应用程序因缺乏资源而被系统杀死,并在稍后重新启动,它会根据需要透明地重新创建实例。

这是一个非常常见的实现,并且在多线程环境中工作:

public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton() {
        // This is the place where you initialize the instance
        // from the database.
    }
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

我在很多地方都使用这种模式;它非常方便。

要真正做到这一点,您还应该在活动中实现onLowMemory () 或onTrimMemory () 以在资源紧张时释放单例实例。

于 2013-02-08T18:51:31.943 回答