Android——跨线程更新UI,Message,Handler

介绍

  Android中UI组件只能在主线程进行更新。

  因此,从其他线程无法操作UI组件更新网络数据。而 Handler ,Message,就是用于线程直接传递消息

  

  Message:在handler和子线程之间传递数据(handler在主线程)

  Handler:发送Message,处理Message。 使用Handler可将子线程的数据通过Message发送到主线程中,再通过handleMessage()进行处理。

属性

  Message

    arg1:int变量,存储数据

    arg2:int变量,存储数据

    what:int变量,区别消息类型

    object:Object类,存储对象

    

方法

  ( Message )

  Message  obtain();

    参数:无

    返回值:Meesage对象

    返回值意义:生成Message对象

    作用:可获取一个Message对象

  

  ( Handler )

  boolean sendMessage( Message message )

    参数:

      Message message:消息对象

    返回值:boolean

    返回值意义:是否发送成功

    作用:发送消息对象到主线程中由handler处理

    

  void handleMessage( Message message )

    参数:

      Message message:回调的消息对象

    返回值:无

    返回值意义:wu

    作用:处理回调的消息对象。

  

使用

  1. 生成内部类 MHandler 继承 Handler ,重写 handleMessage(Message message) 方法。根据message.what分类处理

  2.在子线程中生成Message对象,记录标识what ,携带数据arg1

  3. 通过handler.sendMessage(Message message) 发送数据

  

  

 1 

  
  
public class SecondActivity extends AppCompatActivity {
    private ProgressBar progressBar;
    private MHandler mHandler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        mHandler = new MHandler();
        progressBar = this.findViewById(R.id.pb);

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                int count = 0;
                while ( count < 100){
                    count++;
                    Message message = Message.obtain();
                    message.what = 10;
                    message.arg1 = count;
                    mHandler.sendMessage(message);
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        thread.start();
    }
    class MHandler extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch ( msg.what ){
                case 10:
                    progressBar.setProgress(msg.arg1);
                    break;
                case 20:
                    break;
            }
        }
    }
}

 


 

 

    

    

posted @ 2021-08-14 06:26  remix_alone  阅读(212)  评论(0)    收藏  举报