Handle介绍

一:接下来我来说明一下Handle的用途

Handle到底是什么,我们为什么要来使用Handle,Handle 其实跟Intent有点类似,这里我直说类似,没有说什么是一样的啊。intent是用来实现四大组件之间的通信用的,而Handle呢?这个Handle的用途就是实现线程之间的通信,例如:当子线程做一个耗时的操作的时候,我们并不知道他什么时候做完,做完了也不知道,那么,我们是不是需要一个东西来通知我们,让我们知道呀,所以说,也就有了Handle的来源,没有Handle这个东西,对我们来说,非常的麻烦。

 

1.图形展示

这里写图片描述

2.内部解析:目的(子线程中下载图片,下载完成之后通知主线程更新ui)

1.主线程中有一个消息处理器Handle,被放在主线程中的消息队列中

2.在主线程中有一个MessageQueue 也就是消息队列,存放消息

3.在主线程中也有一个Looper (不停的循环消息队列取消息)如果有新的消息就将消息交给消息处理器,handle会调用其中的handleMessage处理消息

3.具体实施

1.子线程,利用handle发送消息放在主线程的消息队列中

2.主线程里面有一个looper循环获取消息

3.发现新的消息,就会调用handlemessage方法处理消息

    package com.zengtao.classwork;  
 
 
    import android.os.Bundle;  
    import android.os.Handler;  
    import android.os.Message;  
    import android.support.v7.app.ActionBarActivity;  
    import android.widget.ProgressBar;  
 
 
    public class MainActivity extends ActionBarActivity {  
    private ProgressBar pb; // 进度条  
    private int[] randData = new int[100]; // 数组  
    private int index = 0; // 索引  
    private int mProgressStaus = 0; // 设置进度条的长度  
    private Handler mHandler;  
 
 
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  
 
 
    pb = (ProgressBar) findViewById(R.id.pb);  
 
 
    // 初始化handle,绑定在主线程中的队列消息中  
    mHandler = new Handler() {  
    @Override  
    public void handleMessage(Message msg) {  
    super.handleMessage(msg);  
    // 接收消息  
    if (msg.what == 0x111) {  
    mProgressStaus = index;  
    pb.setProgress(mProgressStaus);  
    }  
    }  
    };  
    // 创建子线程,在子线程中处理耗时工作  
    new Thread() {  
    @Override  
    public void run() {  
    super.run();  
    while (index < 100) {  
    doWork();  
    Message msg = new Message();  
    msg.what = 0x111;  
    mHandler.sendMessage(msg);  
    }  
    }  
 
 
    }.start();  
    }  
 
 
    /** 
    * 模拟耗时工作(一定要在子线程中做) 
    *  
    * @return 进度条的多少 
    */  
    public int doWork() {  
    randData[index++] = (int) (Math.random() * 100);   
    try {  
    Thread.sleep(100);  
    } catch (InterruptedException e) {  
    e.printStackTrace();  
    }  
    return index;  
    }  
    }  

四:示例代码注解

1.主线程中创建Handle对象

2.子线程中发送消息到队列中

3.主线程looper获取消息,利用handleMessage()方法处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值