2013-05-07 98 views
4

我一直在使用runOnUiThread方法搞砸了一下。如果我只是在我的活动中做一个方法:Android Java runOnUiThread()

public void Test() 
{ 
    runOnUiThread(new Runnable() 
    { 
     public void run() 
     { 
      Log.v("mainActivity", "test"); 
     } 
    });  
} 

我注意到,这个runnable只运行一次。但是,这不是问题。我想知道的是,如果我完全错过了一些东西,它会在后台执行某些操作,导致在执行该方法几次时帧频下降。

回答

12

这是Activity.runOnUiThread(Runnable)的全身:

public final void runOnUiThread(Runnable action) { 
    if (Thread.currentThread() != mUiThread) { 
     mHandler.post(action); 
    } else { 
     action.run(); 
    } 
} 

的方法体在你的后台线程仍然执行,android.os.Handler类mHandler实现了的Runnable内部队列中的发布到它,所以,除非你是在Runnable(这是一个big在UI线程上禁止)或在短时间内调用这种方法超过一千次,你应该看不到任何区别。

现在,如果您打电话给Handler.postAtFrontOfQueue(Runnable),那么会出现问题,因为您的Runnable本质上是“切入线”。在这种情况下,这可能会导致一个口吃,因为您的Runnable正在执行,而不是需要进行的任何UI更新(如滚动)。

请注意,您只需要到UI线程上运行用户界面更新,就像调用上查看任何方法(因此命名为“UI线程”,为什么这种方法存在),或者文件明确规定,任何操作它需要在UI线程上运行。否则,如果您已经处于后台线程,则没有真正的理由离开它。

+0

活动的mHandler只能在UI线程上工作吗? – likejiujitsu 2014-08-17 19:33:21

+0

@likejiujitsu Handler的特定实例,是的。这就是它的目的。您可以在这里看到如何为另一个线程设置Handler:http://developer.android.com/reference/android/os/Looper.html – 2014-08-18 21:09:33

1

这不太可能会导致您的UI过程的任何重大中断,但在UI线程上运行它确实没有意义。

如果你正在做大量的工作,你应该确保你没有在UI线程上做。