与线程模式混淆

Confused with Thread Pattern

这可能看起来是一个非常有趣和愚蠢的问题..

我正在尝试查看 Android 应用程序中使用 Runnable、线程、服务和 Intent 服务的后台操作。

所以我创建了一个 activity 并在 activity 中创建了一个简单的线程,比如

public class ExectuableThread implements Runnable{
  @Override
  public void run() {
    Log.e("current-thread", String.valueOf(Looper.getMainLooper().isCurrentThread())); // **Returning true**
    btnDone.setText("will not work");
  }
}

所以在上面的场景中按钮文本正在改变。

没关系我这样打电话:

Thread t = new Thread (new ExectuableThread());
t.run();

Thread t = new Thread (new ExectuableThread());
t.start();

如果调用 start(); 为什么我的按钮文本会发生变化? - 何时使用后台线程?

现在是一个非常有趣的场景;如果我像这样延迟 2 秒;

public class ExectuableThread implements Runnable{
  @Override
  public void run() {
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    Log.e("current-thread", String.valueOf(Looper.getMainLooper().isCurrentThread()));
    btnDone.setText("will not work");
  }
}

如果我调用 start(),视图不会更新;在 运行() 调用案例中。它会起作用。

start() 和 运行() 之间的区别很明显,但问题是相同的,如果线程在后台,为什么按钮文本会更新。

首先,你的命名不太好:

public class ExectuableThread implements Runnable {

将暗示此 class 的实例是 线程 ,但它们当然不是。所以你给整个问题添加了混淆

My question is Why My button text is changing if by calling start(); Thread runs in the background.

事情是:当你不做事情的时候"right way",尤其是在多线程中,各种事情都可能发生。

含义:为了更新 Android 中的 UI 个元素,您应该使用 runOnUiThread。在其他线程中更新 UI 元素可能有效,也可能无效。

主要区别是当程序调用 start() 方法时,会创建一个新线程,并在新线程中执行 运行() 方法,而如果直接调用 运行() 方法,则不会创建新线程线程已创建,运行() 中的代码将在当前线程上执行。

第二个区别是,如果你调用 start() 方法两次,那么它会抛出 IllegalStateException