我想知道限制以及处理程序在 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/