Andriod 子线程更新UI

Andoird是不允许直接在子线程中更新UI的。原因是子线程中更新UI会引起线程不安全问题,导致界面卡顿掉帧。

在子线程中run方法中,通过handler.post或其他方式将更新UI的任务消息发送到UI线程,由UI线程更新UI。

Thread和Runnable的区别

  • Thread代表线程类。start()开启子线程,执行体为run()方法
  • Runnable只是一个接口,直接调用其run()方法,并不会开启子线程

下面介绍几种子线程更新UI的方法

方式一:Handler和Message

常规使用方法

子线程run()方法里handle.sendmessage发消息

主线程handler.handleMessage更新ui

Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg){
        String s = String.valueOf(msg.what);
        TextView tv = (TextView)findViewById(R.id.textView);
        tv.setText(tv.getText() + ” ” + s);
    }
};

Runnable run = new Runnable(){
    @Override
    public void run(){
        Random r = new Random();
        int rnum = r.nextInt((100 – 10) + 1) + 10;
        handler.sendEmptyMessage(rnum);
        handler.postDelayed(run, 5000);
        i++;
        if (i==5){
            handler.removeCallbacks(run);
        }
    }
};

 

方式二:在子线程中调用view.post

myView.post(new Runnable() {          
  @Override
  public void run() {
    // 更新UI
    myView.setText(“更新UI”);
  }});

方式三:在子线程中调用runOnUIThread

在子线程中直接调用Activity.runOnUiThread(Runnable action)方法

runOnUiThread(new Runnable() {
  @Override
  public void run() {
    // 更新UI的操作
  }
});

方式四:Handler.post()方法

追踪源码发现,这几种方法也是通过Handler+Message来实现的。一般简单的更新UI推荐使用方法二和方法三

注意

Runable接口run()方法可理解为一个回调,配合Thread.start()才是开启子线程

posted @ 2022-11-09 14:45  随易来了  阅读(428)  评论(0编辑  收藏  举报