为什么这段代码有效?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Log.i("onCreate", Thread.currentThread().toString());
    textView = (TextView) findViewById(R.id.textView);
    imageView = (ImageView) findViewById(R.id.imageView);

    HandlerThread thread = new HandlerThread("myHandlerThread");
    thread.start();
    mUiHandler = new Handler(thread.getLooper());
    mUiHandler.post(new Runnable() {
        @Override
        public void run() {
            Log.i("Thread: ", Thread.currentThread().toString());
            Toast.makeText(getApplicationContext(), "Hello Cats!", Toast.LENGTH_SHORT).show();
            textView.setText("Hello Cats");
            imageView.setImageResource(R.mipmap.ic_launcher);
        }
    });

}

我从某处读到唯一可以与 UI 对象通信的线程是 UI 线程,或者我错过了一些东西

我有一些研究,但还没有找到答案,请帮忙,非常感谢你们。

这是我从日志中得到的
10-13 18:47:42.888 23841-23841/th.co.me.sampleapp I/onCreate: Thread[main,5,main]10-13 18:47:42.891 23841-24041/th.co.me.sampleapp I/Thread:: Thread[myHandlerThread,5,main]
更新 1

我从@nshmura 尝试了这段代码,但错误发生了,现在让我很困惑
   textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        HandlerThread thread = new HandlerThread("myHandlerThread");
        thread.start();
        mUiHandler = new Handler(thread.getLooper());
        mUiHandler.post(new Runnable() {
            @Override
            public void run() {
                Log.i("Thread: ", Thread.currentThread().toString());
                Toast.makeText(getApplicationContext(), "Hello Cats!", Toast.LENGTH_SHORT).show();
                textView.setText("Hello Cats");
                imageView.setImageResource(R.mipmap.ic_launcher);
            }
        });

    }
});

最佳答案

只有在以下情况下才会抛出异常 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.:

  • 从非 ui 线程调用
  • 调用需要更改布局。例如,如果 TextView 的大小(宽度和高度)应该扩展,因为字符串
  • 太长

    因此,如果您的 ui 操作不会导致布局更改(创建或重新创建),则可能不会抛出异常。

    关于android - 为什么设置了HandlerThread的looper的Handler可以和UI Objects交互?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40020371/

    10-12 00:25
    查看更多