我正面临这个问题。我希望我的主线程仅在其他线程完成执行时才恢复执行。但即使其他线程已经执行完毕,我的主线程也没有执行。
我的代码如下:
public class MainActivity extends ActionBarActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.text_test);
TestLocalHost th = new TestLocalHost();
Thread exe = new Thread(th);
exe.start();
try {
exe.join();
}
catch (InterruptedException e){
e.printStackTrace();
}
mTextView.setText("MainThread");
}
private class TestLocalHost implements Runnable {
@Override
public void run() {
final String s = JSONParser.doGet("http://<My system ip>/GetResult.ashx?op=getInfo",null);
runOnUiThread(new Runnable() {
@Override
public void run()
{
mTextView.setText(s);
}
});
}
}
}
我正在使用 exe
线程中的值设置 mTextView
的值。我需要我的主线程在执行后用 "Main thread"
覆盖 mTextView
。我对 exe 线程使用了 join() 函数,这将确保主线程等待该线程完成执行。但是,一旦该线程完成执行,我的主线程就不会写入 mTextView
中。我犯了什么错误?
最佳答案
这与 runOnUiThread
的工作方式有关。
在android中,主线程有一个Looper
。该Looper
持有一个可运行队列来运行,一次运行一个。
当你调用runOnUiThread
时,Runnable
被排队到循环器中,这意味着它将在循环器运行的当前事情完成后执行,并且队列为空。
在您的情况下,当您调用join
时,Looper正在执行onCreate
。这意味着您的 runOnUiThread
将在此之后排队。
就排序而言,这意味着以下调用顺序:
- 创建时
- 开始
- 获取
- runOnUiThread(线程结束)
- setText(在onCreate中)(onCreate结束)
- setText(在 runOnUiThread 中)
关于java - Thread.join - 主线程不会恢复执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23991746/