首页 > 安卓子线程更新UI

安卓子线程更新UI

代码如下,为什么可以通过子线程更新UI.

package com.example.furtherhandler;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class LooperActivity extends Activity {

    private MyThread myThread = new MyThread();
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_looper);
        
        textView = (TextView) findViewById(R.id.textView1);
        myThread.start();
        textView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                myThread.start();
            }
            
        });
        
    }

    class MyThread extends Thread {
        
        @Override
        public void run() {
            textView.setText("Update ui");
        }
        
    }
    
}

并没有什么规定不能在子线程里更新UI,而是不建议在子线程里更新UI,因为在非UI线程更新UI是不安全的(线程安全问题),线程同步处理不好会带来不可预知的问题。你现在的代码逻辑不复杂,不存在UI线程与子线程同步的问题,所以你觉得没问题(实际上也没问题),但还是不符合规范的。


你可以在线程里面加一句睡眠几秒的代码试一下,应该会出现子线程更新ui的错误日志了。因为你是直接在oncreate方法里面开启线程,这个时候还没有对viewRootImpl实例化,所以不会检查是否是主线程。其实所谓不能在子线程更新ui只是官方强烈建议,你要更新也可以,前提是官方自己都没有对是否是子线程check得很好。

【热门文章】
【热门文章】