Handler的多重用法 自动播放图片 进度条实例 与Looper MessageQueue关系

本文详细介绍了Android中Handler的使用,包括其在新线程中发送消息、在主线程中处理消息的机制,以及如何解决线程间通信问题。Handler是Android消息传递的核心,用于处理UI线程更新和定时任务,例如实现动画的自动播放和实时更新进度条。文中通过实例展示了如何创建Handler、发送消息、检查消息队列以及重写handleMessage方法来处理消息。同时,解释了Looper、MessageQueue和Message在Handler机制中的角色和工作原理。

handler主要用法有两各

  1. 在新启动的线程中发送消息
  2. 在主线程中获取 处理消息

Android的消息传递机制是另一种形式的"事件处理" 这种机制主要是为了处理android的多线程问题——android只允许UI线程(当一个程序第一次启动时创建Main线程)修改activity中的UI组件 这样会导致新启动的线程无法动态改变界面组件的属性值。

如采用下图创建线程方式修改textview的值

在这里插入图片描述
会报如下错

在这里插入图片描述

注意:旧的API版本可以直接new Handler(MainActivity中 子线程不行) 在新版本中该使用方法被废弃了 需要重写一个类继承Handler 然后去使用自己写的handler 如果想在子线程里new一个handler 需要先调用Looper.prepare() 再去创建 并且调用 Looper.loop();接收信息

 new Thread(new Runnable() {
   
   
            @Override
            public void run() {
   
   
                Looper.prepare();
                new Handler(){
   
   
                    @Override
                    public void handleMessage(Message msg) {
   
   
                        super.handleMessage(msg);
                    }
                };
                Looper.loop();
            }
        })

在实际android开发中 尤其时涉及动画的游戏开发 需要让新启动的线程周期性的改变界面组件的属性值 这就需要Handler的消息传递机制
如下修改即可在这里插入图片描述
在此处修改textview
在这里插入图片描述

实现方法

  1. 延迟跳转 postDelayed方法 如图设置3s钟后跳转到另一个页面
    在这里插入图片描述
  2. 线程间通信 通过重写handleMessage方法处理消息在这里插入图片描述
  3. 使用hasMessages(int what)检查消息队列中是否包含what属性为指定值的消息
  4. 使用hasMessages(int what,Object object)检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息
  5. 多个重载的Message obtainMessage():获取消息
  6. sendMessage(Message msg)立即发送消息(还有其他类似方法如发送空消息 指定多少毫秒后发送消息)

实例 自动播放动画

public ImageView mContentVideo = itemView.findViewById(R.id.im_video);
{
   
   
// onCreat或者其他处理数据的方法里
        MyHandler handler = new MyHandler();
        // 定义一个计时器 让该计时器周期性执行任务
        new Timer().schedule(new TimerTask() {
   
   
            @Override
            public void run() {
   
   
                // 发送空消息 0x:代表十六进制
                handler.sendEmptyMessage(0x1233);
            }
        },0,3000);

    }


    class MyHandler extends Handler{
   
   
        // 定义周期性显示的图片
        int[] imageIds = {
   
   R.drawable.im_v6,
                R.drawable
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值