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

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

             }
            });
        }
    }
}

我正在使用 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/

相关文章:

java - mchange-commons-java-0.2.11.jar 的 Spring Boot Web 应用程序 FileNotFoundException

Java Google Cloud Endpoints API UTF-8 Unicode 中文字符生成 Android 客户端?

android - 如何将 .jar 文件添加到 Android studio(版本 0.4.0)项目中

java - 同步 Java 线程时如何避免循环逻辑?

java - 针对 Errai 3.1.1.Final 编译 GWT 2.7.0

java - 如何在 POST 期间获取不同资源的 JAX-RS @Path?

java - 创建引用数组

Android O - 混淆了隐式 Intent 和显式 Intent 的定义

c# - 如何在线程之间传递锁?

Java:线程将参数传递给另一个线程