一、Handler的定义:

主要接受子线程发送的数据, 并用此数据配合主线程更新UI.

解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,例如: 联网读取数据,    或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,,会收到Android系统的一个错误提示  "强制关闭".  这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了.,来解决这个复杂的问题 ,    由于Handler运行在主线程中(UI线程中),  它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

二、Handler一些特点

handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
        它有两个作用: (1):  安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行
     
        Handler中分发消息的一些方法
        post(Runnable)
        postAtTime(Runnable,long)
        postDelayed(Runnable long)
        sendEmptyMessage(int)
        sendMessage(Message)
        sendMessageAtTime(Message,long)
        sendMessageDelayed(Message,long)

以上post类方法允许你排列一个Runnable对象到主线程队列中,
        sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

三、Handler实例

(1) 子类需要继承Hendler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据

以下为一个实例,它实现的功能为 : 通过线程修改界面Button的内容

public class MyHandlerActivity extends Activity {
    Button button;
    MyHandler myHandler;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.handlertest);

button = (Button) findViewById(R.id.button);
        myHandler = new MyHandler();
        // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
        // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象
        // (2): 让一个动作,在不同的线程中执行.

// 它安排消息,用以下方法
        // post(Runnable)
        // postAtTime(Runnable,long)
        // postDelayed(Runnable,long)
        // sendEmptyMessage(int)
        // sendMessage(Message);
        // sendMessageAtTime(Message,long)
        // sendMessageDelayed(Message,long)
     
        // 以上方法以 post开头的允许你处理Runnable对象
        //sendMessage()允许你处理Message对象(Message里可以包含数据,)

MyThread m = new MyThread();
        new Thread(m).start();
    }

/**
    * 接受消息,处理消息 ,此Handler会与当前主线程一块运行
    * */

class MyHandler extends Handler {
        public MyHandler() {
        }

public MyHandler(Looper L) {
            super(L);
        }

// 子类必须重写此方法,接受数据
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            Log.d("MyHandler", "handleMessage......");
            super.handleMessage(msg);
            // 此处可以更新UI
            Bundle b = msg.getData();
            String color = b.getString("color");
            MyHandlerActivity.this.button.append(color);

}
    }

class MyThread implements Runnable {
        public void run() {

try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

Log.d("thread.......", "mThread........");
            Message msg = new Message();
            Bundle b = new Bundle();// 存放数据
            b.putString("color", "我的");
            msg.setData(b);

MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI

}
    }

}

Android中的Handler总结相关推荐

  1. 在Android中使用Handler和Thread线程执行后台操作

    在 Android中使用Handler和Thread线程执行后台操作 对于线程的控制,我们将介绍一个 Handler类,使用该类可以对运行在不同线程中的多个任务进行排队,并使用Message和Runn ...

  2. Android中对Handler用法的总结

    Android之Handler用法总结 方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用 ...

  3. Android中有关Handler的总结

    Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.Android利用Handler来实现UI线程的更新的. Handler是Android中的消息发送器,其在哪个Activit ...

  4. Android中的Handler

    当我们在处理下载或是其它须要长时间运行的任务时.假设直接把处理函数放在Activity的OnCreate或是OnStart中.会导致运行过程中整个Activity无响应,假设时间过长,程序就会挂掉. ...

  5. Android中使用Handler和异步任务(AsyncTack)来为UI线程执行费时操作

    出于性能优化的考虑,Android的UI线程不是线程安全的.这致使我们不能在Android的UI线程中执行一些费时的操作,如下载.刷新等.Android中只允许UI线程对Activity中的UI组件进 ...

  6. 浅谈Android中的Handler机制

    Handler是Android中提供的一种异步回调机制,也可以理解为线程间的消息机制.为了避免ANR,我们通常会把一些耗时操作(比如:网络请求.I/O操作.复杂计算等)放到子线程中去执行,而当子线程需 ...

  7. Android中的Handler机制

    直接在UI线程中开启子线程来更新TextView显示的内容,运行程序我们会发现,如下错 误:android.view.ViewRoot$CalledFromWrongThreadException: ...

  8. Android中的Handler, Looper, MessageQueue和Thread

    前几天,和同事探讨了一下Android中的消息机制,探究了消息的发送和接收过程以及与线程之间的关系.虽然我们经常使用这些基础的东西,但对于其内部原理的了解,能使我们更加容易.合理地架构系统,并避免一些 ...

  9. Android中的Handler的具体用法

    Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.Android利用Handler来实现UI线程的更新的. Handler是Android中的消息发送器,其在哪个Activit ...

最新文章

  1. 关于get和post两种提交方式
  2. python读写二进制
  3. Netty源码解析8-ChannelHandler实例之CodecHandler
  4. 【每周CV论文】初学GAN图像风格化必须要读的文章
  5. 学习scorllview
  6. mysql 主从二进制日志_Mysql-8 配置主从复制(基于二进制日志)
  7. C#LeetCode刷题之#39-组合总和(Combination Sum)
  8. ADS1675调试无时钟输出
  9. 解封装(三):AVFormatContext分析
  10. Memcached: 目录
  11. nand flash 写数据粗略流程
  12. C语言抽奖程序随机实现,简单的号码抽奖程序 - oixxan的个人博客 - OSCHINA - 中文开源技术交流社区...
  13. 清华刘知远:教你用HowNet在深度学习时代搞事情(附论文下载)
  14. python谢尔宾斯基三角形
  15. [LOL自走棋] 种族职业数据
  16. ARIMA模型的定阶原理与建模分析
  17. vue:如何实现文字竖排
  18. Action Recognition with Improved Trajectories
  19. 仿真软件proteus构建流水灯实验
  20. gta5结局杀老崔我哭了_GTA5:每个主角都在故事里得到了自己想要的东西,但崔佛却是白给...

热门文章

  1. 干货篇:创业对待数据挖掘要注意这5点
  2. Android 6.0 设备强制要求开启全盘加密
  3. CMU机器学习学院院长Tom Mitchell:计算机模拟人脑才刚刚起步
  4. iOS开发 适配iOS10以及Xcode8-b
  5. Antd Vue 组件库之Table表单
  6. Nginx Image缩略图模块加强网站运行速度
  7. 如何在六个月或更短的时间内成为DevOps工程师(三):版本控制
  8. springboot logback自定义配置文件路径
  9. Linux入门学习(九)
  10. python时间格式转换time模块