处理程序处理消息时UI正在中断
问题描述:
我有一大堆对象。对于每个对象,我需要执行一些复杂的耗时操作,例如构造一个位图。在此之后,我需要使用此对象更新UI,例如向Google地图添加标记。我以下列方式执行此操作:处理程序处理消息时UI正在中断
Handler myHandler = new Handler(){
public void handleMessage(Message msg){
Myobject obj = (MyObject)msg.obj;
googleMap.add(obj); // doing some UI related staff with this obj
}
};
new Thread(new Runnable(){
public void run(){
for(final Myobject obj:objList){
// doing the complex task here
Message msg = new Message();
msg.obj = obj;
myHandler.sendMessage(msg);
}
}
}).start();
此代码正在运行。问题是 - 我在标题栏中显示加载ProgressBar。当所有对象被处理并添加到UI时,我将隐藏进度条。我在做这项工作的方式是在每次发送邮件时中断UI。由于列表非常大,进度条和用户界面不能顺利显示。
我的问题是,我该如何改进?有没有其他方法可以实现这一目标?
答
为什么你不只是每次完成一个位图更新变量,并从计时器更新进度条,让我们说每秒钟左右。这样你就不会一直阻塞UI线程。
这是不可能的,因为我需要用线程内处理的对象来做一些与UI相关的任务。请参阅最新的问题。 – Nayan 2013-04-24 22:31:36
这取决于您想要运行的线程数。反正我不会在同一时间跑太多。也许使用具有同时线程体面限制的ThreadPool会有所帮助。我也不会单独执行每个UI操作。尝试合并它们并定期执行它们。同样,如果你创建了这么多的位图,也许你的应用程序只是内存不足,这就是它慢的原因。 – SimonSays 2013-04-24 22:49:55
实际上,我正在从远程API获取一些数据,为每个数据创建一个多边形对象并在Google地图上添加该标记。多边形创建需要一些计算。另外每个多边形都在其上显示一个标签,所以我还需要为每个多边形创建一个位图。 – Nayan 2013-04-25 19:09:38