美文网首页
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