Thread.join - 主线程不会恢复执行

时间:2014-06-02 09:52:19

标签: java android multithreading

我正面临这个问题。我希望我的主线程仅在其他线程完成执行时才恢复执行。但是我的主线程即使其他线程完成了执行也没有执行。

我的代码如下:

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

             }
            });
        }
    }
}

我使用mTextView线程中的值设置exe的值。我需要主线程在执行后用mTextView覆盖"Main thread"。我使用join()函数来exe线程,这将确保主线程将等待此线程完成执行。但是一旦这个线程完成了exectuion,我的主线程就没有写入mTextView。我在做什么错误?

3 个答案:

答案 0 :(得分:3)

这与runOnUiThread的工作方式有关。

在android中,主线程有一个LooperLooper保持一个runnable队列,一次一个。

当你调用runOnUiThread时,Runnable被排入looper,意味着它将在looper运行的当前事件完成后执行,并且队列为空。

在您的情况下,当您致电onCreate时,Looper正在执行join。这意味着您的runOnUiThread将在此之后入队。

在排序方面,这意味着发出以下呼叫顺序:

  • 的onCreate
  • 启动
  • 的doGet
  • runOnUiThread(线程结束)
  • setText(在onCreate中)(onCreate结束)
  • setText(在runOnUiThread中)

答案 1 :(得分:1)

&#34; 主线程没有写入mTextView &#34;是Thread exerunOnUiThread()方法开始的更早终止。由于join()仅等待Thread exe完成(而不是另一个),因此您可以覆盖{em>&#34; MainThread&#34; mTextView覆盖 String s 在另一个线程上设置。

您可以查看,例如,查看Log

...
mTextView.setText("MainThread");
Log.d("THREAD", mTextView.getText().toString());

答案 2 :(得分:-2)

尝试使用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. 

 }
}