【发布时间】:2020-01-14 10:49:02
【问题描述】:
我正在用 Kotlin 编写一个简单的 Android 应用程序,它将向用户显示按类别划分的祈祷。 assets 文件夹中有 5 个 JSON 文件,每个文件只有 10 KiB 左右。
我使用 Klaxon 将 JSON 文件解析为这两个数据类:
data class Prayer(val prayerName: String, val verseTitle: String, val verseBody: String,
val prayerLine: String, val prayerBody: String, val prayerEnding: String)
data class PrayerCategory(val title: String, val bgImage: String, val headerImage: String,
val prayers : List<Prayer>)
这是我用来解析祈祷的代码:
private fun loadPrayerNames(jsonFile: String) {
val millis = measureTimeMillis {
val input = assets.open("${jsonFile}.json")
val prayerCategory = Klaxon().parse<PrayerCategory>(input)
if (prayerCategory != null) {
for (prayer in prayerCategory.prayers) {
val prayerName = prayer.prayerName
prayersMap[prayerName] = prayer
}
}
}
println("Loading prayer category took $millis ms.")
}
如您所见,只有 一个 访问资产。没有 assets.list(),没有废话。 正如你所注意到的,我已经测量了时间..让你猜猜..这是调试输出:
加载祈祷类别耗时 3427 毫秒。
是的,没错。加载和解析 10KiB 大 JSON 花了 3.5 秒! 我重复一遍。不涉及火箭科学。只需解析 10 KiB JSON。 3.5秒……嗯……
顺便说一句,我正在诺基亚 6.1 上测试它,这是一款非常活泼的手机。
所以..我的问题:
- 是什么导致了这种行为?
- 除了建立一个数据库来存储大约 50 个祈祷词之外,还有什么方法可以加快速度?
非常感谢您的帮助!
【问题讨论】:
-
@Drawn Raccoon 现在尝试了,它花了更长的时间:3472 ms :D ...不过这可能是 Klaxon 的问题。我发现了这个:github.com/cbeust/klaxon/issues/154.. 现在尝试使用 Moshi 作为替代方案,现在加载“仅”需要 1000 毫秒。
-
您可以在模块的
build.gradle文件中的android闭包中尝试aaptOptions { noCompress "json" },以禁用JSON 压缩,看看是否能提高性能。或者,将整个资产读入String,然后解析字符串,看看是否能提高性能。 -
@CommonsWare 感谢您的建议,但我已经使用不同的解决方案解决了它。我相信 Android 资产在这里是完全无辜的。 :-)
标签: android json kotlin klaxon