我的活动是下载并显示公告(来自公告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);
设置线程的优先级以正确的方式?
剖析你的代码,看看究竟是什么导致了滞后。看看:http://developer.android.com/guide/developing/debugging/debugging-tracing.html – Ash