与线程模式混淆
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
这可能看起来是一个非常有趣和愚蠢的问题..
我正在尝试查看 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