2015-03-30 59 views
0

我想要回發到特定的(調用)線程,可能是線程ID。
DoStuff()在UI線程上運行時工作正常,但對我來說不再是一種選擇。發佈到特定線程

void DoStuff() 
{ 
    long origThreadID_A = Thread.currentThread().getId(); 
    Log.d(TAG, "origThreadID (A): " + origThreadID_A); 

    new Thread(new Runnable() 
    { 
     public void run() 
     { 
      //Do something on new thread 

      <[WHAT_GOES_HERE?]>(new Runnable() //This used to be 'activity.runOnUiThread', 
      { 
       public void run() 
       { 
        long origThreadID_B = Thread.currentThread().getId(); 
        Log.d(TAG, "origThreadID (B): " + origThreadID_B); 

        //Do something on original thread 
       } 
      }); 
     } 
    }).start(); 
} 

如何發佈和/或在特定線程上運行某些內容?

回答

1

您在該線程上創建一個Handler並將該Runnable發佈到該處理程序。如果你想能夠通過id發佈到一個線程,你必須在某處保持一個線程id的映射給Handlers。請記住,任何使用處理程序的線程都必須在某處調用Looper.loop()。

+0

是不是Looper.loop()阻塞呼叫?如何在不阻止DoStuff()線程的情況下執行此操作?當我在UI線程上運行DoStuff()時,我可以發佈它,而不會使UI線程阻塞。 – cowlinator 2015-03-30 22:42:53

+1

Looper.loop啓動一個事件循環。所以它永遠不會回來,但它不會嚴格阻止 - 你只需編寫你的線程來處理事件。當然,你必須爲任何發佈到線程的方法做到這一點,Android只是爲你設置UI線程(UI線程有一個Looper,Looper.loop被稱爲初始化的一部分)。 – 2015-03-30 22:45:54