Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用OnRetainOnConfiguration实例的替代方案_Android - Fatal编程技术网

Android 使用OnRetainOnConfiguration实例的替代方案

Android 使用OnRetainOnConfiguration实例的替代方案,android,Android,我有一个应用程序,在单个玩家的应用程序使用过程中可能会跟踪大量数据,我的应用程序一次最多允许5名玩家,这意味着大量数据可能会乘以5 当活动被销毁时,我将所有数据写入我的SQLite数据库,这样做很好 该问题发生在方向更改期间。我使用OnRetainonConfiguration实例是因为我认为我至少可以依靠它来改变方向,但我发现Android中发生的其他事情可能会抹去我的数据。用户报告的一些示例: - While the app was running, the user took a phon

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

当活动被销毁时,我将所有数据写入我的SQLite数据库,这样做很好

该问题发生在方向更改期间。我使用OnRetainonConfiguration实例是因为我认为我至少可以依靠它来改变方向,但我发现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.
我知道OnRetainonConfiguration实例的使用是个问题,因为我的应用程序最初将每个播放器的每个数据字段写入一个捆绑包,虽然应用程序是以这种方式实现的,但在几个月的过程中没有遇到任何问题

我一发现OnRetainonConfiguration实例并将其用于实现,就开始收到投诉

我的实现很简单。我的执行情况如下:

@Override
public Object onRetainNonConfigurationInstance()
{
    return mPlayers;  //array of player objects
}
然后在onCreate中,我执行以下操作:

mPlayers = (PlayerData [])getLastNonConfigurationInstance();
既然存在一些潜在的问题,那么在屏幕旋转过程中保留大量用户数据的最佳选择是什么


谢谢你的帮助

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


如果你打算让人们离开,做一些可能导致进程终止的内存密集型事情,那么就使用Bundle。

使用setRetainInstance(true)创建一个片段,写下需要保留的字段并添加到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;
}

谢谢菲米。让我再补充一点问题。我认为捆绑是更好的选择,但什么是前进的最佳方式?例如,假设我有100个要保留的字符串。将100个不同长度的单独字符串塞进包中可以吗?或者我应该实现某种捆绑包扩展吗?或者,在这些条件下,有什么更好的方法吗?该捆绑包将采用大多数原语(包括字符串)的数组和ArrayList。我过去在感到懒惰时做过的一件事基本上就是用我想要的比特和片段构建一个JSON对象,然后将其序列化到包中。在另一边反序列化它,你就可以开始了。