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

标签 java android multithreading handler

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

相关文章:

Java - 为什么我不能在 while 循环中更改变量?

android - React Native : Packae com. reactnativenavigation.react 不存在

android - 钛备份 - 坚持搜索应用程序数据

asp.net - SQL Server,连接池与特殊情况下的静态连接

java - 在不同状态之间传输数据

Java 用 n 个值的列表扩展 arraylist

java - 写入子进程的标准输入

java - 在Android/Linux上设置透明的TCP代理问题

java - 数据源拒绝建立连接,来自服务器的消息 : “Too many connections” ? - 多线程

c++ - 此线程清理警告中的竞赛在哪里?