Android中的Handler机制

2,100 阅读2分钟

Android中的Handler机制

1、Android系统不允许在主线程中执行耗时操作。(activity和service不超过5秒,BoroadcastReceiver组件广播不超过10秒)

2、耗时操作交给工作线程去完成。有时,耗时工作完成后,需要通知主线程/需要更新ui组件,需要有一种机制在主线程和工作现场之间进行通信。这是机制在Android中即为handler机制

3、handler不是另外开启一个线程,他归属于主线程。在主线程中声明和实例化handler对象

4、主/子线程消息传递的机制一般处理步骤(sendMessage/handleMessage的方式)

a) 在主线程中声明和实例化handler对象,重写handleMessage(Message msg)方法。

b)在子线程中,

1、构建Message对象(Message对象的构建有两种方式)

2、封装数据(最多传两个整型数据,object类型的数据,Bundle类型的数据)

3、sendMessage方法将消息传递给主线程

c)在主线程的handleMessage(Message msg)方法中处理消息

5、Message对象的构建有两种方式

a)新建一个Message:Message msg=new Message

b)从消息池中获取一个消息:Message msg=handler.obtainMessage();

推荐使用方法b。原因是不需要重复去新建Message,可以节省内存空间

6、如果有多个子线程向主线程发消息,在主线程中需要判断消息来至于哪个子线程。如何判断呢?-----what值。what可以是一个int值,也可以是封装在Message中what属性

a)只是简单的标识子线程,子线程没有数据传递给主线程可以用:SendEmptyMessage(int 的what)值

b)不仅要标识子线程,而且子线程有数据传递给主线程

Message msg=handler.obtainMessage();
mag.what=1;
mag.obj=.....

c)主线程的判断方式

handleMessage(Message msg)
{
 Switch(ms.what)
{
 case1:
 ......
 break;
 case2:
 ......
 break;
}
}

7、post方式来处理子线程与主线程的通信

a)主线程只需要实例化handler对象

b)子线程中调用post方法,post方法的参数是一个Runnable对象,该对象的run方法实现主线程要做的事情,例如更新ui

public void download(View view) {
        num=0;
        new Thread(){
        @Override
        public void run() {
            super.run();
            while (num<100){
                try {
                    Thread.sleep(3000);
                    num+=10;
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            //主线程做的
                            pbprogress.setProgress(num);
                            tvprogress.setText(num+"%");
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
    }