Handler消息处理机制(一)

来源:互联网 发布:veket linux安卓 编辑:程序博客网 时间:2024/06/05 01:51

Handler消息处理机制(一)


消息处理思想流程:
如获得了服务器的数据,要让界面改变显示数据
但是 要改变界面必须得在主线程中完成,而主线程不能实现耗时操作(网络请求是耗时操作)
所以 要在子线程中完成网络请求 再把消息传给主线程 让主线程去更改界面


消息处理方法流程:
在主线程创建Handler对象 并重写handelMessage()方法
创建子线程,在子线程中调用sentMessage()方法,该消息会存于MessageQueue消息队列中, 通过Looper对象取出MessageQueue中的一条消息,再给回Handler去调用handlerMessage()


消息处理具体方法使用:
1 在主线程创建Handler对象,重写handlerMessage方法
HandlerMessage会根据子线程发送消息而再去调用

Handler handler = new Handler() {    @Override    public void handleMessage(Message msg) {        switch (msg.what) {            case 0: {                // 主线程收到子线程传来的消息调用此方法 进行UI更新                Log.i("dialogNumbers", String.valueOf(dialogNumbers));                questionBody.setText(getAQData.questionArray.get(dialogNumbers));                setProgress();                break;            }        }    }};

2 创建子线程:(在需要通知主线程的地方 进行消息的发送
Handler.sentEmptyMessage(0) 0是标识 让主线程根据不同的标识进行不同的操作)

private void setProgress() {    new Thread(new Runnable() {        @Override        public void run() {            currentprogress = 0;   // 设置初始值为0            while (currentprogress <= progressBar.getMax()) {   //设置循环5次                if (currentprogress == 0) {                    currentprogress++;                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                } else {                    progressBar.setProgress(currentprogress);                    currentprogress++;//设置每1S进度加1                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }            // 进度完成时跳转下一页            dialogNumbers++;            // 重置进度            progressBar.setProgress(0);            // 发送消息给主线程 通知它去更新UI 这里的0为标识 可以让主线程根据不同的标识进行不同的操作            handler.sendEmptyMessage(0);        }    }).start();}

要传值:

Message message=new Message();Bundle bundle=new Bundle();bundle.putString("values",values);message.setData(bundle);myHandler.sendMessage(message);//发送message信息message.what=3;String xiabiaoString= msg.getData().getString("values");

问题:
会有内存泄漏的可能?

原创粉丝点击