Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.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 重复调用SharedReferences apply()会导致OutOfMemoryError_Android_Sharedpreferences - Fatal编程技术网

Android 重复调用SharedReferences apply()会导致OutOfMemoryError

Android 重复调用SharedReferences apply()会导致OutOfMemoryError,android,sharedpreferences,Android,Sharedpreferences,我正在使用FirebaseOnChildadedlistener在我的Android应用程序中持久存储某些数据。当应用程序启动时,可能会触发数千次。每次触发时,我都使用SharedReferencesapply来编写一个简单的键/值对。键和值本身不是很大,但可能有几千个存储在SharedReference中 我对使用apply感到很兴奋,因为它在内存缓存和延迟实际的SharedReferencesXML写入方面发挥了一些神奇的作用。然而,我发现如果我在几秒钟内调用apply1000-2000次,

我正在使用Firebase
OnChildaded
listener在我的Android应用程序中持久存储某些数据。当应用程序启动时,可能会触发数千次。每次触发时,我都使用SharedReferences
apply
来编写一个简单的键/值对。键和值本身不是很大,但可能有几千个存储在SharedReference中

我对使用
apply
感到很兴奋,因为它在内存缓存和延迟实际的SharedReferencesXML写入方面发挥了一些神奇的作用。然而,我发现如果我在几秒钟内调用
apply
1000-2000次,就会出现OutOfMemory错误

在内部,SharedReferencesImpl似乎正在基于旧的
Map
创建一个新的
Map
,前提是对实际XML的写入仍在排队。然而,这导致了Java堆上似乎有几千个
Map
条目(我相信),并且我得到了一个
OutOfMemory
错误


也许我应该每隔50次左右调用
commit
调用
apply
——这样我就不会遇到内存不足的错误,尽管我可能会看到一个小的性能影响?我该怎么办?无论如何,这似乎有点骇人。

我的解决方案是在该位置上使用Firebase单事件侦听器,
放置我的数千项,然后调用
应用()
。您还必须跟踪已经看到的关键点(一个
String
s的
HashSet


然后,制作一个
ChildEventListener
,只要忽略
onchildaded
,如果密钥存在于我的
HashSet

,我的解决方案是在该位置使用一个Firebase单事件监听器,
put
我的数千项,然后调用
apply()
。您还必须跟踪已经看到的关键点(一个
String
s的
HashSet


然后,制作一个
ChildEventListener
,只要忽略
onchildaded
,如果该键存在于我的
哈希集中

共享首选项并不用于存储如此大的数据。你应该选择sql数据库,而不是阅读。我发现很难相信SharedReferences不能存储几千个键/值对,其中每个键和值都只有几个字符(最多50个)。是的,但这就是你的代码共享首选项的问题,它不意味着存储如此大的数据。您应该选择sql数据库,而不是head。我发现很难相信SharedReferences不能存储几千个键/值对,其中每个键和值只有几个字符(最多50个)。是的,但这就是代码的问题