Android子线程更新UI的方法

Android设定上UI是独立的线程,并且在UI线程之外是不能够更新UI的,官方的说法是由于UI线程是不安全的,这样做是为了提高稳定性,因此想要更新UI就得在主线程进行

//官方推荐使用Handle以及Message类从主线程发送消息告知UI线程
//以达到更新UI的目的

public class MyActivity extends AppCompatActivity {
    //这里假设界面上有一个显示文本的组件
    //以及一个更新文本的按钮
    private TextView textView;
    private Button button;
    
    private MyHandle handle;
    
    //通过handle来更新UI
    class MyHandle extends Handle {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //这里可以使用msg的what、arg1、arg2、obj属性
            //来达到更新UI的目的
            //以下为样例
            if (msg.what == 1) {
                textView.setText("新文本");
            }
        }
    }
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        textView = findViewById(R.id.textView);
        button = findViewById(R.id.button);
        
        //初始化handle
        handle = new MyHandle();
        
        //给按钮添加点击事件
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //这里假设在另外一个线程里对UI线程发出消息
                new Thread() {
                    @Override
                    public void run() {
                        //第一种用法
                        Message msg = new Message();
                        msg.what = 1;//what属性可保存字符串
                        //msg.args1 = 100; //arg1、arg2属性可保存整形数据
                        //msg.args2 = 200;
                        //msg.obj = new String(); //obj属性可以保存一个Object对象
                        handle.sendMessage(msg);
                        
                        //第二种用法
                        //看了下obtainMessage的实现方法,
                        //(what)
                        //(obj)
                        //(arg1,arg2)
                        //(what,arg1,arg2,obj)
                        handle.obtainMessage(WHAT,arg1,arg2,obj).sendToTarget();
                        
                        //第三种用法
                        //直接发送一个空的Message
                        handle.sendEmptyMessage(what);
                    }
                }.start();
            }
        });
    }
}
Last modification:May 9th, 2019 at 01:05 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment