gpt4 book ai didi

android - 为什么在主 Looper 线程中运行 Handler

转载 作者:行者123 更新时间:2023-11-29 18:37:24 25 4
gpt4 key购买 nike

我读到 Android Handler可用于与主通信 Looper线程发布将与 View 交互的消息(因为只有主线程可以在那里与 View 交互)

但我经常看到类似下面示例的代码运行 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 {

}
}

最佳答案

Handler 不仅仅用于与 main Looper 通信。

Looper是一个遍历消息队列并分派(dispatch)它们的类,每个实例都与一个 Thread 一起工作.

A HandlerThreadThread还有一个 Looper附在上面。

“主要”Thread你的申请也是一个HandlerThread .

当您实例化 Handler 时使用空构造函数,Handler将附加到 LooperThread您正在其中创建实例。例如,如果您创建一个 ThreadonCreateActivity , 然后是 Handler将附加到主(UI)Thread因为生命周期回调在那里执行。

当您调用 post(Runnable) 时, Runnable将在线程 Handler 上运行的 Looper附于。所以,如果你创建一个 Handler在您的 Activity 的生命周期回调之一中, 那么无论哪个Thread你发布 Runnable from, 它将始终在 main Thread 上执行

这是最常见的用法,也是您的代码所做的,但不是唯一的用法。例如,您可以实例化一个 HandlerThread , 然后来自 Activity生命周期回调你可以发布 Runnable执行非常长的操作并且不会阻塞您的 UI,因为它将在不同的 Thread 上执行.

post(Runnable) 的另一种用法(有时是针对奇怪的 UI 错误的通用脏修复)是从主线程调用它,目的只是为了延迟执行,直到整个方法执行完毕。

fun onCreate(savedInstanceState: Bundle?) {
Handler().post {
// code here is executed after `onCreate` has returned
}
// code here is executed before the one posted on the Handler
}

关于android - 为什么在主 Looper 线程中运行 Handler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53758678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com