当前位置:   article > 正文

Android 之Handle的使用原理理解_说下handle原理

说下handle原理


Handle的使用,首先我们要明白一点,那就是Handle的用处,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方法处理消息


三:示例代码:

  1. package com.zengtao.classwork;
  2. import android.os.Bundle;
  3. import android.os.Handler;
  4. import android.os.Message;
  5. import android.support.v7.app.ActionBarActivity;
  6. import android.widget.ProgressBar;
  7. public class MainActivity extends ActionBarActivity {
  8. private ProgressBar pb; // 进度条
  9. private int[] randData = new int[100]; // 数组
  10. private int index = 0; // 索引
  11. private int mProgressStaus = 0; // 设置进度条的长度
  12. private Handler mHandler;
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. pb = (ProgressBar) findViewById(R.id.pb);
  18. // 初始化handle,绑定在主线程中的队列消息中
  19. mHandler = new Handler() {
  20. @Override
  21. public void handleMessage(Message msg) {
  22. super.handleMessage(msg);
  23. // 接收消息
  24. if (msg.what == 0x111) {
  25. mProgressStaus = index;
  26. pb.setProgress(mProgressStaus);
  27. }
  28. }
  29. };
  30. // 创建子线程,在子线程中处理耗时工作
  31. new Thread() {
  32. @Override
  33. public void run() {
  34. super.run();
  35. while (index < 100) {
  36. doWork();
  37. Message msg = new Message();
  38. msg.what = 0x111;
  39. mHandler.sendMessage(msg);
  40. }
  41. }
  42. }.start();
  43. }
  44. /**
  45. * 模拟耗时工作(一定要在子线程中做)
  46. *
  47. * @return 进度条的多少
  48. */
  49. public int doWork() {
  50. randData[index++] = (int) (Math.random() * 100);
  51. try {
  52. Thread.sleep(100);
  53. } catch (InterruptedException e) {
  54. e.printStackTrace();
  55. }
  56. return index;
  57. }
  58. }



四:示例代码注解

1.主线程中创建Handle对象

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

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



以上便是handle的使用,以及原理的解析,写的不明白的,请谅解,将此分享给大家,希望对你们有所帮助。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/250711
推荐阅读
相关标签
  

闽ICP备14008679号