2012-01-25 49 views
1

我的活动是下载并显示公告(来自公告web服务)。为了保持UI响应我下面在后台线程操作:Android:使用多线程使UI响应(实现平滑滚动)

1)上传XML(数据存储在XML),

2)处理XML,

3)上传图片。

再说,我更改用户界面和后台线程的优先级,以保持UI线程响应:

在主线程

Thread.currentThread().setPriority(10); 

在后台线程:

Thread.currentThread().setPriority(1); 

每个公告被放在到TableRow中,并且每个TableRow都使用处理程序放在TableView中。 当用户滚动TableView并即将到达表的末尾时,会添加新行并发送下一个通告的HTTP-GET(+ parcing(使用XPath)+图像上传+填充带有内容的表行)。

我的问题:

上传和解析是在过程的用户界面时

是只有部分反应(有一些滞后0.1-0.5sec每当用户滚动TableView中)。

我想做绝对平滑的滚动不依赖于数据上传/处理。

以错误的方式做了什么,还有什么可以在这里完成? 例如,如果我减少处理程序中的操作次数,它应该会提高响应能力......也许就是这样。但是,我看不到那里耗费大量资源的指令。


UPDATE

我使用的ListView来代替TableLayout改写了我的代码,因为前者是相当快的(事实证明,我不知道)。但是,当XML处理和ListView滚动同时进行时,我仍然会出现尖峰。我做了2个实验:

1)我删除了所有后台进程 - 向下滚动时向ListView添加了新行,但没有为这些行处理数据(所以它们保持为空) - 此类变体工作良好,没有任何秒杀,UI绝对响应。

2)第二个实验是移除对ListView更新的调用(XML文件已处理,但发现的数据未传递给ListView适配器) - 那次我有尖峰。所以我得出结论这些尖峰是由于后台线程,并不是由于UI更新调用。 如果让我们的应用程序的优先级低于主应用程序的优先级,后台线程如何减慢我的应用程序?

Thread.currentThread().setPriority(some_int); 

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

+0

剖析你的代码,看看究竟是什么导致了滞后。看看:http://developer.android.com/guide/developing/debugging/debugging-tracing.html – Ash

回答

0

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

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

-1

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