我有一个带有 RadListView 组件的 nativescript-vue 应用程序来向用户显示数据。列表的每一行都包含当前项目的多个信息。当我点击按钮加载并显示列表时,UI 冻结(快速硬件 -> 短;慢速硬件 -> 长)。我发现加载/组合数据的代码部分运行时间很短,但原生脚本内部渲染或 UI 元素的创建是问题所在。android控制台显示信息
I/Choreographer: Skipped 430 frames! The application may be doing too much work on its main thread.
平台信息:
- tns-ios 5.2.0
- tns-android 5.2.1
- nativescript-ui-listview 6.2.0
- tns 核心模块 5.3.1
类似问题报告
我查看了 stackoverflow 和 github,但那里的问题(例如NativeScript Angular RadListView 渲染速度非常慢)看起来很相似,但解决方案不适合我。
我使用 LinearListView(不是 Grid 也不是 Stagged),也许在我的真实应用程序中,我将能够简化列表中的行元素,但在我的示例应用程序(向下看)中,我使用简单的行 ui 设计。
示例应用
为了获得更简单更好的报告,我在 {N}-Playground 上创建了一个示例应用程序。该应用程序创建 10000 个数组元素并将它们设置为 RadListView 的源,其中每个元素都有一个标签、一个开关和一个 ActivityIndicator。
<RadListView ref="listView"
for="alarm in alarms"
layout="linear">
<v-template>
<StackLayout class="list-element" orientation="vertical" >
<GridLayout columns="*, auto, auto" rows="*">
<Label col="0" row="0">{{alarm.name}}</Label>
<Switch col="1" row="0" :checked="alarm.active" />
<ActivityIndicator col="2" row="0" :busy="alarm.active"/>
</GridLayout>
<Label class="list-element-divider"></Label>
</StackLayout>
</v-template>
</RadListView>
在第一步中,将在一个临时数组中生成 10000 个元素:
loadData() {
this.tmpAlarms = [];
for (let i = 0; i <= 10000; i++) {
this.tmpAlarms.push({
name: "Hase " + i,
active: i % 2 === 0,
});
}
}
使用第二个按钮将临时数组设置为源:
setData() {
this.alarms = this.tmpAlarms;
}
注意:即使示例应用程序在 S9 或其他高端智能手机上运行,我也使用 10000 个元素来使问题可见。
完整源码可在https://play.nativescript.org/?template=play-vue&id=Td1GWR下运行
在https://play.nativescript.org/?template=play-vue&id=5BXOFG下使用 ObservableArray 而不是普通数组的稍微不同的版本
在这两个版本中,数据处理速度很快,但是一旦从内部函数生成的 UI 元素,UI 就会被冻结。
示例:在我的带有 Android 6.x 的 Nexus 7 2013 上,UI 冻结了近 6 秒,并且没有其他应用程序在后台运行。
iOS
如果我在 iOS 设备(例如 iPhone 7s)上尝试相同的应用程序,渲染速度非常快,即使有 10000 个元素等等,UI 运行也很流畅。
想法?
Have anyone an idea how i can speed up the rendering? If not is there a suggestion how i can build an animation (e.g. ActivityIndicator) to show the user that the device is working? At the moment when i put an ActivityIndicator on the UI the user can not see it because of the frozen UI.