2013-02-08 76 views
2

我正在开发一个Android应用程序,并且我希望避免在使用相同额外的相同活动来源时重新加载类似数据。在Android中保存同一活动的多个实例状态

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

例子:

答:ID1 - >答:ID2 - > A:ID3

但是,它也可以是一个额外的,我已经装:

答:ID1 - >答:ID2 - >答:ID3 - >答:ID1

在这种情况下,我不会再要求服务器或失去活动叠加。根据我的理解,“onSaveInstanceState”允许保存一个Activity的一个实例,但在我的情况下,它是同一个Activity的多个实例(带有不同的额外值)。

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

在此先感谢

回答

3

onSaveInstanceState方法是不是在你所描述的方式使用。 Check this out,它是活动类的文档,特别是活动生命周期部分。 onSaveInstanceState是一种在操作系统由于某种原因必须杀死一个Activity时被调用的方法。它允许您填充一个Bundle,它将帮助重新创建用户停止的Activity的特定实例。通常发生这种情况的原因是用户切换到不同的应用程序,操作系统正在杀死活动来回收内存,但也发生在屏幕旋转,所以这是平台的一个细微之处,至少要知道的重要。

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

这很好,因为数据将持续多次使用该应用程序。进一步来说,如果服务器的数据可能会过时,那么可以很容易地扩展它,以便最初显示数据库中的数据,并引发对数据的异步请求,以在数据返回时更新UI和数据库。你的用户几乎永远不会处于等待加载的状态,这总是一件好事!

Here's a good tutorial on the basics of implementing an sqlite database.这也将给你额外的好处,保持数据存储在单独的应用程序运行。

作为一种替代方案,如果您不真的需要数据库的持久性或其他功能,并且不认为开销是值得的,那么可以创建一个Singleton类,用于跟踪返回的数据,也许使用Application class来实现它。重要的是要注意(并且带给我们整整一圈),任何存储这种数据的内存方法都应该使用onSaveInstanceState进行管理,以确保在活动在意外时间被杀死时不会丢失任何数据。

+0

首先,谢谢你的回答。现在我明白了onSaveInstanceState的好处。 我曾经想过要保存数据(例如在数据库中),但是,有一件事我没有提前指定。我收到的一些数据是API提供的图片,根据使用条款,我没有权限存储它们。这就是为什么,我试图恢复视图而不是数据。 – Barles 2013-02-08 16:01:25

+0

我明白了。图像非常棘手,无法将它们保存到磁盘上会限制您的选择。有些事情要注意的是,图像(特别是Bitmaps,如果这就是你正在使用的)会占用大量内存,并导致OutOfMemoryException异常,这种情况太臭了。最好将所有可以存储在数据库中的数据存储起来,然后每次需要映像时都可以创建一个新的API调用。正如我提出的一种替代解决方案,您可以尝试某种类型的缓存,但这样做会更有效,并且可能会引入不稳定性。 – MattDavis 2013-02-08 16:13:01

+0

是的,我会尝试存储所有我可以并依靠[Android通用图像加载器](https://github.com/nostra13/Android-Universal-Image-Loader)来管理缓存图片的数据。 – Barles 2013-02-08 22:22:36

0

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

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

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

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()以在资源紧张时释放单例实例。