1

我的活动是下载和显示公告(来自公告网络服务)。为了保持 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);

设置线程优先级的正确方法?

4

2 回答 2

0

在某些时候,UI 线程需要添加这些新对象,在内存中创建新的 UI 对象,并将它们添加到绘制列表中。您可以尝试通过在 UI 中制作大量不可见的表格行来预先分配所需的内存。这可能会解决一些问题,因为 UI 线程可能会尝试重新分配其内存以为新的 TableRows 腾出空间。

此外,您可以尝试在后台线程中使用Thread.yield() 。这会通知 android 操作系统该线程已准备好,并且如果需要允许 UI 线程的恢复(如果 UI 线程空闲,它会立即恢复)。

于 2012-01-25T11:07:55.880 回答
-1

如果您没有在 UI 线程上执行任何 I/O,那么您描述的滞后可能是布局通过。建议你专注于优化你的布局。你有什么理由不使用 ListView 吗?

于 2012-01-25T11:21:25.080 回答