学习笔记(三)——有用的Handler

本文详细介绍了Android中的Handler机制,包括其定义、作用及如何用于实现定时任务。此外还讲解了Looper和MessageQueue的作用,并通过示例代码展示了如何使用Handler实现一个倒计时功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Handler

定义:接收子线程发送过来的一些信息和带有消息队列的进程对象,从而在主线程中进行的相应的操作。

作用:
- 定时执行Message和MessageQueue
- 让一个动作在不同线程中执行

常用方法:

  • 发送消息
    //post(Runnable)
    // postAtTime(Runnable,long)
    // postDelayed(Runnable,long)
    post是处理Runnable对象;
    // sendEmptyMessage(int)
    // sendMessage(Message);
    // sendMessageAtTime(Message,long)
    // sendMessageDelayed(Message,long)

  • 接收消息
    handleMessage(Message msg); 子类必须重写此方法,处理消息

一个使用handler来实现一个倒计时的按钮:

public class HandlerButtonActivity extends Activity {

    private static final int Message_Code=8888888;

    private TextView textView;
    private TextHandler textHandler=new TextHandler(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.handlerbutton);
        textView = (TextView) findViewById(R.id.text01);

        Message message=textHandler.obtainMessage();//最好不要用new Handler因为不便于销毁

        message.arg1=0;
        message.arg2=1;
        message.what= Message_Code;
        message.obj=10000;
        textHandler.sendMessageDelayed(message,1000);//延迟1s发送消息
    }
    public TextView getTextView(){
        return textView;
    }

    public static class TextHandler extends Handler{

        public final WeakReference mHandlerbuttonActivityWeakReference;

        public TextHandler(HandlerButtonActivity activity){
            mHandlerbuttonActivityWeakReference=new WeakReference(activity);
        }
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            HandlerButtonActivity handlerButtonActivity=mHandlerbuttonActivityWeakReference.get();//弱引用对象

            switch (msg.what){ //接受消息
                case Message_Code:
                    int value= (int) msg.obj;
                    handlerButtonActivity.getTextView().setText(String.valueOf(value/1000));

                    msg=Message.obtain();
                    msg.arg1=0;
                    msg.arg2=1;
                    msg.what= Message_Code;
                    msg.obj=value-1000;

                    if(value>0)
                        sendMessageDelayed(msg,1000);
                    break;
            }
        }
    }
   }

老师在视频中说使用弱引用可以避免内存泄漏的问题,因为当activity被销毁时,Handler所传递的Message对象存在于消息对列中,不会随着activity销毁而销毁。

Looper和MessageQueue

Looper:消息泵,就是不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper;
MessageQueue:消息队列,用来存放Handler发送过来的消息;
Android 系统的消息队列都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列和一个消息循环(Looper)。但是创建的工作线程默认是没有消息循环和消息队列的,如果想让该线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。

 
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();//给线程创建一个消息循环
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();//使消息循环起作用,从消息队列里取消息,处理消息
}
}

在其他人的资料中,找到一些有用的东西:
Looper.loop()之后的代码不会被立即执行,当调用后 mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。Looper对象通过MessageQueue 来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。
Activity是一个UI线程,运行于主线程中,Android系统在启动的时候会为Activity创建一个消息队列和消息循环(Looper);

一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值