handler机制

handler机制

什么是Handler机制:是Android提供的一套更新UI的机制,可以用于发送消息和处理消息,也可以进行异步通信。
Handler中的角色

主要有handler,message,Looper,MeaasgeQueue几个角色

  • Message为Handler接受和处理的消息对象。

  • MessageQueue为消息队列以先进先出的方式管理Message。

  • Looper负责读取MessageQueue,读到之后交给发送消息的Handle进行处理。创建时会在构造器中创建MessageQueue对象。

主要是子线程中的程序使用Message夹带数据传输至handler中,完成子线程对主线程的ui更新。

​ 用于子线程和主线程进行通信,一般将耗时的任务放在子线程中执行,执行完毕需要告诉主线程,就可以使用handler进行通信。

子线程中通过一个handler调用sendMessage(),将消息发送到主线程的消息队列中,主线程中handlerMessage()获得消息。

通信机制:

handler的通信机制

代码实现:

  • step1 主线程中声明一个handler对象,重写handleMessage方法,在该方法中可以获得子线程传过来的数据,进行操作如更新UI
  • step2 开辟一个新的线程,在里面执行一些耗时的操作,调用sendMessage方法将消息返回给主线程中
  • step3 主线程收到message,执行操作
public class HandlerActivity extends Activity {
    private Button btn;
    private TextView tv;
    private Handler handler = new Handler(Looper.myLooper()){
        @Override
        public void handleMessage(@NonNull Message msg) { // step1
            super.handleMessage(msg); 
             // step3
            if (msg.what == 0) {
                String s = (String) msg.obj;
                tv.setText(s);
                Toast.makeText(HandlerActivity.this,"主线程收到消息",Toast.LENGTH_SHORT).show();
            }
        }
    };
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handle);
        initView();
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() { // step2
                    @Override
                    public void run() {
                      String str = getString();
                      Message message = new Message();
                      message.what = 0; // 用于标识是message来的消息
                      message.obj = str; // 将内容放到obj中
                      handler.sendMessage(message);// 将message发给主线程
                    }
                }).start();
                Toast.makeText(HandlerActivity.this,"完成",Toast.LENGTH_SHORT).show();
            }
        });
    }

    /**
     * onCreate中调用,用于初始化控件
     */
    private void initView() {
        tv = findViewById(R.id.contente_tv);
        btn = findViewById(R.id.handler_btn);
    }


    /**
     * 模拟耗时操作
     * @return
     */
    private String getString(){
        String result = "";
        StringBuilder stringBuilder = new StringBuilder();
        for (int i=0;i<100;i++){
            stringBuilder.append(i);
        }

        try {
            Thread.sleep(6000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        result = stringBuilder.toString();

        return result;
    }
}

界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/contente_tv"
        android:text="handler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/handler_btn"
        android:text="send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>
同步和异步

当程序开始执行时,这时开启一个线程,如果所有的任务都执行在这一个线程中,那么程序就从上往下依次执行,这个是同步。
如果在程序中新开一个线程,此时就会有两个线程,两个线程在同一个时间内都在执行,此时可以能有多个任务都在执行,当有耗时的任务需要执行,如果放在主线程中,就会让主线程等待太久,如果将它放在子线程中执行,耗时任务完成后,得到的结果给主线程,这样主线程的其他任务正常执行,子线程也在执行,这是异步。

同步异步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值