美文网首页
handler使用流程图

handler使用流程图

作者: cc_And | 来源:发表于2019-08-24 15:01 被阅读0次
    hanlder流程.jpg

    1、handler是什么

    1. handler是Android给我们用来更新Ui的一套机制,是一套消息处理的机制。用于线程之间的通信,可以通过它来处理消息,。

    2、为什么使用handler,不使用handler可以更新UI吗?

    是不行的,Android在设计的时候,封装了一套消息创建、传递、处理机制。如果不遵循这样的机制是没有办法更新Ui的,会抛出异常信息。
    举个例子:

          在主线程中去更新uI
            bt1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    new Thread() {
                        @Override
                        public void run() {
                            super.run();
                            try {
                              //模拟耗时操作
                                sleep(1000);
                                bt1.setText("在子线程更新了Ui!");
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }.start();
                }
            });
    

    运行后抛出了异常:不能在工作线程中更新UI

      android.view.ViewRootImpl$CalledFromWrongThreadException:
                                              Only the original thread that created a view hierarchy can touch its views.
    

    所以Android只能在主(UI)线程中更新UI

    3、handler使用介绍(一)

    在Android中我们应该怎么去更新Ui呢?
    用handler去更新UI

    handler.post();使用

        //创建handler对象
        Handler handler = new Handler();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ButterKnife.bind(this);
            bt1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    new Thread() {
                        @Override
                        public void run() {
                            super.run();
                            try {
                              //模拟耗时操作
                                sleep(1000);
                                //post更新UI 
                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                      //ru方法是在主线程中的
                                        bt1.setText("在子线程更新了Ui!");
                                    }
                                });
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }.start();
                }
            });
    
    

    handler.postDelayed();发送延时消息
    先看效果
    每秒加1

    GIF.gif

    代码

     //创建handler对象
        Handler handler = new Handler();
        private int index;
        private Myrunnable myrunnable;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ButterKnife.bind(this);
            myrunnable = new Myrunnable();
            index = 0;
               new Thread(){
                @Override
                public void run() {
                    super.run();
                    bt1.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            //一秒发送一次
                            handler.postDelayed(myrunnable, 1000);
                        }
                    });
                }
            }.start();
            bt2.setText("stop");
            bt2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //关闭此定时器
                    handler.removeCallbacks(myrunnable);
                }
            });
    
        }
    
        class Myrunnable implements Runnable {
            @Override
            public void run() {
                //更新Ui操作
                index++;
                //间隔1秒+1
                bt1.setText("index" + index);
                //一秒发送一次
                handler.postDelayed(myrunnable, 1000);
            }
        }
    
    

    4、handler使用介绍(二)

                            handler.sendMessage(message);
    

    效果:通过sendmessage发送给主线程消息


    GIF.gif
     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ButterKnife.bind(this);
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    bt1.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            try {
                                //耗时操作
                                sleep(2000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            //发送给主线程去更新信息
                            Message message = new Message();
                            //发送的标识,接受的时候判断水去接受
                            message.what = 0;
                            //传递单个int类型的值
                            message.arg1 = 100;
                            //发送任意类型的,可以是服务器传回来的jsoN,s实体类
                            message.obj = "我是任意类型的数据{Joson,[数组],集合}";
                            handler.sendMessage(message);
                        }
                    });
                }
            }.start();
        }
    
        //接受发送回来的消息
        Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case 0:
                        bt1.setText("我被改变了这是message0的 " + msg.arg1 + msg.obj);
                        break;
                }
            }
        };
    
    

    未完待续....

    相关文章

      网友评论

          本文标题:handler使用流程图

          本文链接:https://www.haomeiwen.com/subject/hkhqectx.html