gpt4 book ai didi

java - 处理程序真正将其消息发布到哪里?

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

我想知道限制以及处理程序在 Android 中的工作方式。

我能理解为什么这完全符合预期:

public class MainActivity extends Activity {

TextView tv;
Handler mHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new Handler();
tv = new TextView(this);
tv.setText("original text");
setContentView(tv);

new Thread(new Runnable() {
@Override
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {
tv.setText("changing from instance member handler");
}
});
}
}).start();
}

正如预期的那样,该代码更改了 TextView,而没有提示处于错误的线程中。我在 UI 线程上创建了我的处理程序。

但是,我不明白的是......为什么这也有效?

public class MainActivity extends Activity {

TextView tv;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
tv.setText("original text");
setContentView(tv);

new Thread(new Runnable() {
Handler handler = new Handler();
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
tv.setText("changing from different thread.");
}
});
}
}).start();
}

两个问题:

1) 我已经从非 UI 线程创建了我的处理程序,但它仍然更新 textview 而不会提示触摸 UI 线程之外的 View 。这是为什么?我的消息实际发布到哪里?

2) 假设我有 20 段这样的代码,我每次都创建一个新的 Handler 实例,是否会出现 UI 线程耗尽问题或性能问题?

注意:如果我在一个线程中创建一个线程,并在该内部线程中实例化处理程序,那么 TextView 不能在那里被触及。

最佳答案

只有 run() 中的代码在另一个线程中执行。所有的初始化都是在创建类的线程中完成的。 Runnable 完全在 ui 线程内创建。

如果你要这样写

new Thread(new Runnable() {
@Override
public void run() {
Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
tv.setText("changing from different thread.");
}
});
}
}).start();

你会崩溃,因为线程中没有循环程序。

关于java - 处理程序真正将其消息发布到哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20340479/

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