我的活动是下载和显示公告(来自公告网络服务)。为了保持 UI 响应,我在后台线程中执行以下操作:
1)上传XML(数据存储在XML中),
2)处理XML,
3)上传图片。
此外,我更改了 UI 和后台线程的优先级以保持 UI 线程响应:
在主线程中:
Thread.currentThread().setPriority(10);
在后台线程中:
Thread.currentThread().setPriority(1);
每个公告都放入一个 TableRow 中,每个 TableRow 都使用处理程序放入 TableView 中。当用户滚动 TableView 并即将到达表的末尾时,会添加新行并发送用于下一个公告的 HTTP-GET(+ 解析(使用 XPath)+ 图像上传 + 用内容填充表行)。
我的问题:
当上传和解析正在进行时,用户界面只是部分响应(当用户滚动 TableView 时,每个延迟有 0.1-0.5 秒)。
我想进行不依赖于数据上传/处理的绝对平滑滚动。
以错误的方式做了什么,还有什么可以在这里做的?例如,如果我减少处理程序中的操作数量,它应该会提高响应能力......也许就是这样。但是,我在那里没有看到繁重且耗费资源的指令。
更新
我使用 ListView 而不是 TableLayout 重写了我的代码,因为前者要快得多(事实证明,我不知道)。但是当 XML 处理和 ListView 滚动同时进行时,我仍然会遇到峰值。我做了2个实验:
1)我删除了所有后台进程 - 向下滚动时将新行添加到 ListView 中,但没有为这些行处理任何数据(因此它们保持为空) - 这种变体效果很好,没有任何尖峰,UI 绝对响应。
2)第二个实验是删除对 ListView 更新的调用(处理了 XML 文件,但找到的数据没有传递给 ListView 适配器)——那时我遇到了峰值。所以我得出结论,这些峰值是由于后台线程造成的,而不是由于 UI 更新调用。如果我让后台线程的优先级低于主线程的优先级,后台线程如何减慢我的应用程序的速度?
是
Thread.currentThread().setPriority(some_int);
设置线程优先级的正确方法?