2011-06-15 75 views
4

我有一个应用程序,可能跟踪单个玩家在应用程序使用过程中的大量数据,而且我的应用程序一次最多可以允许5个玩家,这意味着大量数据可能会相乘times 5.替代使用onRetainNonConfigurationInstance

当Activity被销毁时,我将所有的数据写入到我的SQLite数据库,并且工作正常。

问题发生在方向更改期间。我使用onRetainNonConfigurationInstance是因为我认为我至少可以依靠它来改变方向,但是我发现Android中的其他事情可能会消除我的数据。用户报告的一些例子:

- While the app was running, the user took a phone call. After returning to the app, the data was gone. 
- While the app was running, another user downloaded an update to a different app from the Market, and found the data gone after returning to the app. 
- While the app was running, another user started a different app (a music player), and returned to find the data gone. 

我知道,使用onRetainNonConfigurationInstance的是问题,因为我的应用程序最初写每一个人数据字段为每个玩家束,并同时应用程序是实现这种方式,没有问题在数月中遇到。

一旦我发现onRetainNonConfigurationInstance,并用它来执行,我开始接受投诉。

我的实现很简单。我实现如下:

@Override 
public Object onRetainNonConfigurationInstance() 
{ 
    return mPlayers; //array of player objects 
} 

然后在的onCreate,我这样做:

mPlayers = (PlayerData [])getLastNonConfigurationInstance(); 

因为似乎有一些潜在的问题,什么是保存整个屏幕的大量用户数据的最佳替代品旋转?

感谢您的帮助!

回答

4

使用Bundle:onRetainNonConfigurationInstance的问题在于它与应用程序进程的生命周期相关联,即使进程完全终止,Bundle也可以保存和恢复。

如果您打算让人们关闭并且做可能导致进程死亡的内存密集型事情,那么请使用Bundle。

+0

谢谢Femi。让我再补充一点这个问题。我认为Bundle是更好的选择,但是推进的最佳方式是什么?例如,假设我有100个我想保留的字符串。可以将100个不同长度的独立字符串填充到Bundle中吗?或者我应该实现某种Bundle扩展?或者在这些情况下有什么可以更好的工作? – Michael 2011-06-16 02:24:09

+0

Bundle将采用包括字符串在内的大多数基元的数组和ArrayLists。我过去做过的一件事情是,当我感到懒惰时,基本上只是用我想要的零散件构建一个JSON对象,然后将其序列化到Bundle中。在另一端反序列化它,你很好走。 – Femi 2011-06-16 02:36:33

+0

好的,谢谢费米,我会试试看。 – Michael 2011-06-16 03:30:13