这看起来可能是一个非常有趣和愚蠢的问题。
我试图在Android应用程序中查看Runnables,Threads,Services和Intent Services的后台操作。
所以我创建了一个活动并在活动中创建了一个简单的线程,比如
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();
OR
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(),则视图不会更新;在run()调用的情况下。它会起作用。
start()和run()之间的区别很明显,但是如果Thread在后台,按钮文本的更新问题也是一样的。
答案 0 :(得分:2)
首先,您的命名不太好:
public class ExectuableThread implements Runnable {
意味着这个类的实例是线程,但当然不是。因此,您正在将混淆添加到整个问题中。
我的问题是为什么我的按钮文字正在改变,如果通过调用start();线程在后台运行。
事情是:当你没有以“正确的方式”做事时,特别是在多线程中,各种各样的事情都会发生。
含义:为了更新Android中的UI元素,您应该使用runOnUiThread。更新其他线程中的UI元素可能有效,也可能无效。
答案 1 :(得分:-1)
主要区别在于,当程序调用start()方法时,会创建一个新的Thread并在新的Thread中执行run()方法,而如果直接调用run()方法,则不会创建新的Thread并且run()中的代码将会在当前线程上执行。
第二个区别是如果你调用start()方法两次,那么它将抛出IllegalStateException