2013-04-24 156 views
0

我有一大堆对象。对于每个对象,我需要执行一些复杂的耗时操作,例如构造一个位图。在此之后,我需要使用此对象更新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。由于列表非常大,进度条和用户界面不能顺利显示。

我的问题是,我该如何改进?有没有其他方法可以实现这一目标?

回答

0

为什么你不只是每次完成一个位图更新变量,并从计时器更新进度条,让我们说每秒钟左右。这样你就不会一直阻塞UI线程。

+0

这是不可能的,因为我需要用线程内处理的对象来做一些与UI相关的任务。请参阅最新的问题。 – Nayan 2013-04-24 22:31:36

+0

这取决于您想要运行的线程数。反正我不会在同一时间跑太多。也许使用具有同时线程体面限制的ThreadPool会有所帮助。我也不会单独执行每个UI操作。尝试合并它们并定期执行它们。同样,如果你创建了这么多的位图,也许你的应用程序只是内存不足,这就是它慢的原因。 – SimonSays 2013-04-24 22:49:55

+0

实际上,我正在从远程API获取一些数据,为每个数据创建一个多边形对象并在Google地图上添加该标记。多边形创建需要一些计算。另外每个多边形都在其上显示一个标签,所以我还需要为每个多边形创建一个位图。 – Nayan 2013-04-25 19:09:38