2015-03-30 40 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