使用onRetainNonConfigurationInstance的替代方法

时间:2011-06-15 05:54:38

标签: android

我有一个应用程序,可能会在应用程序使用期间为单个玩家跟踪大量数据,而我的应用程序一次最多允许5个玩家,这意味着大量数据可能会乘以5倍。 / p>

当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是个问题,因为我的应用程序最初将每个玩家的每个单独的数据字段写入一个包,并且当应用程序以这种方式实现时,在几个月的过程中没有遇到任何问题。 / p>

当我发现onRetainNonConfigurationInstance并将其用于我的实施时,我开始接受投诉。

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

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

然后在onCreate中,我这样做:

mPlayers = (PlayerData [])getLastNonConfigurationInstance();

由于似乎存在一些潜在的问题,在屏幕轮换中保留大量用户数据的最佳选择是什么?

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

使用Bundle:onRetainNonConfigurationInstance的问题在于它与应用程序进程的生命周期相关联,而Bundle可以保存并恢复,即使进程被完全杀死。

如果你打算让人们离开并做一些记忆密集的事情,这可能会导致这个过程被杀死,那就去捆绑吧。

答案 1 :(得分:0)

使用setRetainInstance(true)创建一个Fragment,编写需要保留在其中的字段并添加到Activity。

private PlayerData[] mPlayerDataArr;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

public void setPlayerDataArr(PlayerData[] playerDataArr){
    this.mPlayerDataArr = playerDataArr;
}

public PlayerData[] getPlayerDataArr() {
    return mPlayerDataArr;
}