如何优化和减少嵌套列表(向下 3 层)中的反序列化时间?
How to optimize and reduce the time of deserialization in a nested list(3 levels down)?
我有一个非常大的 json 数据,我需要反序列化并将其转换为列表(集合)以便稍后在 recyclerView 中使用,我使用 gson(2.8 版)。 8) 用于反序列化。问题是我需要在 3 个循环中进行迭代以获得最终数据并将其作为正确的类型添加到结果列表中。
我正面临巨大的 outOfmemory,屏幕冻结,有时由于数据量大而崩溃。
我尝试了一个简单的 for, forEach, asSequence()?.iterator()?甚至 .asSequence()?.asStream()? 但没有任何效果。
下面的代码在存储库中,我通过 viewModelScope.launch(Dispatchers.IO) 从 viewModel 调用它,最终从片段中观察到:
lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { ...}}
这是我使用的代码:
private fun formatToPost(posts: List<ArticleLivePost?>?): LinkedList<ArticleLiveItem> {
val items = LinkedList<ArticleLiveItem>()
val gsonParser = GsonBuilder().create()
posts?.asSequence()?.iterator()?.forEach { postsList ->
postsList?.posts()?.asSequence()?.asStream()?.forEach { post ->
val contentList = JsonParser.parseString(post.content()).asJsonArray
val contents = mutableListOf<ArticlePostLiveItem>()
val title = StringBuilder(post.title())
for (content in contentList) {
val type = content.asJsonObject.get(TYPE_KEY).asString
Timber.d("listPosts type$type")
val element = content.asJsonObject.get(ELEMENT_KEY)
Timber.d("listPosts element$element")
when (type) {
DATEPOST.valueType -> {
val postDate = gsonParser.fromJson(
element.toString(), DatePost::class.java
)
contents.add(postDate)
}
IMAGEPOST.valueType -> {
val postImage = gsonParser.fromJson(
element.toString(), ImagePost::class.java
)
contents.add(postImage)
}
//****** Lot of other types remain to add yet
}
}
items.add(Post(title, contents))
}
}
return items
}
故事结尾:
recyclerView 奇怪行为的起源:
它被放置在一个 nestedScrollView 中。
快速的解决方案是将它放在 nestedScrollView 之外。
我有一个非常大的 json 数据,我需要反序列化并将其转换为列表(集合)以便稍后在 recyclerView 中使用,我使用 gson(2.8 版)。 8) 用于反序列化。问题是我需要在 3 个循环中进行迭代以获得最终数据并将其作为正确的类型添加到结果列表中。
我正面临巨大的 outOfmemory,屏幕冻结,有时由于数据量大而崩溃。 我尝试了一个简单的 for, forEach, asSequence()?.iterator()?甚至 .asSequence()?.asStream()? 但没有任何效果。
下面的代码在存储库中,我通过 viewModelScope.launch(Dispatchers.IO) 从 viewModel 调用它,最终从片段中观察到: lifecycleScope.launch { viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { ...}}
这是我使用的代码:
private fun formatToPost(posts: List<ArticleLivePost?>?): LinkedList<ArticleLiveItem> {
val items = LinkedList<ArticleLiveItem>()
val gsonParser = GsonBuilder().create()
posts?.asSequence()?.iterator()?.forEach { postsList ->
postsList?.posts()?.asSequence()?.asStream()?.forEach { post ->
val contentList = JsonParser.parseString(post.content()).asJsonArray
val contents = mutableListOf<ArticlePostLiveItem>()
val title = StringBuilder(post.title())
for (content in contentList) {
val type = content.asJsonObject.get(TYPE_KEY).asString
Timber.d("listPosts type$type")
val element = content.asJsonObject.get(ELEMENT_KEY)
Timber.d("listPosts element$element")
when (type) {
DATEPOST.valueType -> {
val postDate = gsonParser.fromJson(
element.toString(), DatePost::class.java
)
contents.add(postDate)
}
IMAGEPOST.valueType -> {
val postImage = gsonParser.fromJson(
element.toString(), ImagePost::class.java
)
contents.add(postImage)
}
//****** Lot of other types remain to add yet
}
}
items.add(Post(title, contents))
}
}
return items
}
故事结尾:
recyclerView 奇怪行为的起源: 它被放置在一个 nestedScrollView 中。 快速的解决方案是将它放在 nestedScrollView 之外。