2013-05-07 94 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線程上做。