Android中的Handler机制

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();
    }

请多多指教~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值