Java Thread.join-主线程赢得';不要恢复执行
我面临着这个问题。我希望我的主线程仅在其他线程完成其执行时才恢复其执行。但是我的主线程没有执行,即使其他线程已经完成了它们的执行 我的代码如下:Java Thread.join-主线程赢得';不要恢复执行,java,android,multithreading,Java,Android,Multithreading,我面临着这个问题。我希望我的主线程仅在其他线程完成其执行时才恢复其执行。但是我的主线程没有执行,即使其他线程已经完成了它们的执行 我的代码如下: public class MainActivity extends ActionBarActivity { private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate
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);
}
});
}
}
}
公共类MainActivity扩展了ActionBarActivity{
私有文本视图mTextView;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView=(TextView)findviewbyd(R.id.text\u测试);
TestLocalHost th=新的TestLocalHost();
线程exe=新线程(th);
exe.start();
试一试{
exe.join();
}
捕捉(中断异常e){
e、 printStackTrace();
}
setText(“主线程”);
}
私有类TestLocalHost实现可运行{
@凌驾
公开募捐{
最后一个字符串s=JSONParser.doGet(“http:///GetResult.ashx?op=getInfo“,空);
runOnUiThread(新的Runnable(){
@凌驾
公开募捐
{
mTextView.setText;
}
});
}
}
}
我正在使用
exe
线程中的值设置mTextView
的值。我需要我的主线程在执行后用“主线程”
覆盖mTextView
。我对exe
线程使用了一个join()
函数,该函数将确保主线程等待该线程完成执行。但一旦这个线程完成执行,我的主线程就不会写入mTextView
。我犯了什么错误?尝试使用AsyncTask。正是为了这个目的
private class GetDataFromNetwork extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
//Get Data using url
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
//Update UI Here. This runs on the UI Thread.
}
}
私有类GetDataFromNetwork扩展异步任务{
受保护的长doInBackground(URL…URL){
int count=url.length;
长totalSize=0;
for(int i=0;i
导致“主线程未写入mTextView
”的原因是thread exe
比runOnUiThread()
方法启动的线程提前终止。由于join()
只等待Thread exe
完成(而不是另一个),因此您似乎会得到mTextView
的“主线程”被另一个线程上设置的字符串s覆盖
例如,您可以通过查看Log
:
...
mTextView.setText("MainThread");
Log.d("THREAD", mTextView.getText().toString());
这与
runOnUiThread
的工作方式有关
在android中,主线程有一个活套
。该Looper
持有一个可运行队列,一次一个
当您调用runOnUiThread
时,Runnable
被排入循环器队列,这意味着它将在循环器运行的当前操作完成后执行,并且队列为空
在您的情况下,当您调用join
时,循环器正在执行onCreate
。这意味着您的runOnUiThread
将在此之后排队等待
就顺序而言,这意味着调用的顺序如下:
- 一次创建
- 开始
- 多吉特
- runOnUiThread(螺纹末端)
- setText(在onCreate中)(onCreate结束)
- setText(在RunUnuithRead中)
mTextView.setText(“主线程”)之前或之后处理
@blackbelt谢谢你的概念。在这种情况下,我应该采取什么方法?实际上,我希望runnable部分首先执行,并且只有在runnable完成执行之后,主线程才能继续,即mTextView.setText(“主线程”),我通常使用委托模式,让线程通知它们的状态。