我了解到Android Handler可用于与Looper主线程进行通信以发布将与视图交互的消息(因为只有主线程可以与那里的视图交互)
但是我经常看到类似下面示例的代码在主线程中运行Handler。为什么要做一个好的思考,除非像postDelayed(new Runnable()...
任何对此的解释都很好
public class TaleDemoActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
new Handler().post(new Runnable() {
@Override
public void run() {
new Handler().post(new Runnable() {
@Override
public void run() {
new Tale("Hello runnables!").tell();
}
});
new Handler().post(new Runnable() {
@Override
public void run() {
new Tale("Hello runnables!").at().tell();
}
});
}
});
new Handler().post(new TestRunnable());
new Handler().post(new TestStaticRunnable());
new Handler().post(new TestAbstractRunnable() {
@Override
public void run() {
new Tale("Hello abstract runnable!").tell();
}
});
new Handler().post(new TestInterfaceRunnable() {
@Override
public void run() {
new Tale("Hello test interface runnable!").tell();
}
});
new Tale().at().tell();
}
class TestRunnable implements Runnable {
@Override
public void run() {
new Tale("Hello testRunnable!").tell();
}
}
static class TestStaticRunnable implements Runnable {
@Override
public void run() {
new Tale("Hello testStaticRunnable!").tell();
}
}
abstract class TestAbstractRunnable implements Runnable {
}
interface TestInterfaceRunnable extends Runnable {
}
}
答案 0 :(得分:2)
Handler不仅用于与 main Looper通信。
Looper
是一个类,它遍历消息队列并调度它们,每个实例都使用一个Thread
。
HandlerThread
是Thread
,并且还附加了Looper
。
应用程序的“主” Thread
也是HandlerThread
。
使用空的构造函数实例化Handler
时,Handler
将附加到您要在其中创建实例的Looper
的{{1}}上。例如,如果您在Thread
的{{1}}中创建了Thread
,则onCreate
将附加到主(UI)Activity
,因为生命周期回调在那里执行。
当您调用Handler
时,Thread
将在连接有post(Runnable)
的{{1}}的线程上运行。因此,如果您在Runnable
的生命周期回调之一中创建Handler
,则无论您从哪个Looper
发布Handler
,它都将始终在主要的Activity
这是最常见的用法,它是代码的用途,但不是唯一的用法。例如,您可以实例化一个Thread
,然后从Runnable
生命周期回调中发布一个执行非常长操作的Thread
,并且不会阻塞UI,因为它将在不同的HandlerThread
。
Activity
的另一种用法(有时是针对怪异的UI错误的通用脏修复)是从主线程中调用它,只是为了将执行延迟到整个方法执行之后。
Runnable