Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Thread.join-主线程赢得';不要恢复执行_Java_Android_Multithreading - Fatal编程技术网

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中)

连接将完全阻止UI线程,直到您的线程死亡,并且没有人可以向您保证您在被阻止的UI线程上发布的Runnable将在
mTextView.setText(“主线程”)之前或之后处理
@blackbelt谢谢你的概念。在这种情况下,我应该采取什么方法?实际上,我希望runnable部分首先执行,并且只有在runnable完成执行之后,主线程才能继续,即mTextView.setText(“主线程”),我通常使用委托模式,让线程通知它们的状态。