RunOnUiThread内部循环效率

时间:2013-08-20 14:57:29

标签: android

如果考虑效率,可以做以下事吗?

new Runnable() {

        @Override
        public void run() {
            try {
                final Runnable uitask = new Runnable() {
                    public void run() {
                        //sth that modifies UI
                    }
                };

                for (...) {
                    context.runOnUiThread(uitask);
                    Thread.sleep(...);
                }
            } catch (Throwable t) {
            }
        }
    }

我最关心的是runOnUi每次都可能创建新线程,这会非常糟糕吗?我是对的还是比ThreadPool更聪明?

2 个答案:

答案 0 :(得分:5)

好吧,runOnUiThread不会创建新线程,它会在现有UI线程上启动runnable。

但不是你的代码,你可以做

 void onCreate(..) {
     ...
     mHandler = new Handler();
 }

 for (...) {
     mHandler.postDelayed(uitask, DELAY * i++);
 }

答案 1 :(得分:0)

  

我最担心的是runOnUi可能会分别创建新的线程   时间,这会非常糟糕吗?

好。这取决于你想要达到的目标。在Android中,本机线程效率不高。如何进行后台工作有更有效的方法(SDK提供)。

如果您想做一些定期工作,可以使用Handler来实现目标。只需创建一个Runnable,然后您就可以发送定期回调请求。另一种解决方案是使用在后台运行的Services。它们直接用于长期运行的任务,并为后台处理提供了非常便利的方式。

有时您需要告知用户有关您的任务当前进度的一些信息,因此在这种情况下,您只需使用提到的处理程序或AsyncTask

我认为您的解决方案并不干净有效。如果您将创建例如40个Threads,那么您的工作将不会更快或更高效。您的GB会尖叫,应用程序将占用CPU的大部分内容,并且您不应该允许高电量消耗。