msg.obj与msg.what、this与super

本文深入探讨了Android与Java编程中的核心概念,包括消息处理机制msg.obj与msg.what的作用与区别,this与super在构造方法调用中的不同,Android中setVisibility()方法的三种状态及其含义,以及Java中toString()方法的复杂应用。这些知识点对于理解和掌握Android应用程序开发及Java语言基础至关重要。

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

1、msg.obj与msg.what
(1)msg.obj :是用来放对象的,这个对象可以是任何类型;
msg.what : 只能放数字;(在if判断中可以用到)

(2)Message有两种获取方法
Message msg = new Message();
Message msg = handler.obtainMessage();
这两种方法的区别是,前者是new的,需要开辟内存空间;后取者是从global Message pool中,性能消耗相对少;

2、this与super
this 只能调用自身的构造方法;
super 可以调用父类的构造方法。

3、Android setVisibility()
setVisibility():
有三个参数:Parameters:visibility One of VISIBLE,
INVISIBLE,
GONE,
对应的三个常量值:0、4、8
VISIBLE:0 意思是可见的
INVISIBILITY:4 意思是不可见的,但还占着原来的空间
GONE:8 意思是不可见的,不占用原来的布局空间

4、JAVA——toString()
【1】undefined和null没有toString()方法
【2】布尔型数据true和false返回对应的’true’和’false’
【3】字符串类型原值返回
【4】数值类型的情况较复杂
1、正浮点数及NaN、Infinity加引号返回
2、负浮点数或加’+'号的正浮点数直接跟上.toString(),相当于先运行toString()方法,再添加正负号,转换为数字
3、整数直接跟上.toString()形式,会报错,提示无效标记,因为整数后的点会被识别为小数点,数字在使用toString()方法时,加括号可解决。
【5】对象Object类型及自定义对象类型加括号返回[object Object]

private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case GET_CARD_INFO: cancelProg(); String cardInfo = (String)msg.obj; tv_cardInfo.setText(cardInfo); displayData("CardInfo", cardInfo); Log.e(TAG,"the CardInfo is ===========" + cardInfo); break; case WRITE_CARD_INFO: cancelProg(); String writeCardInfo = (String)msg.obj; Toast.makeText(MainActivity.this, writeCardInfo, Toast.LENGTH_LONG).show(); tv_sendData.setText(writeCardInfo); displayData("writeCardInfo", writeCardInfo); Log.e(TAG,"the writeCardInfo is ===========" + writeCardInfo); break; case GET_CARD_SN: cancelProg(); String sn = (String) msg.obj; tv_seriesNumber.setText(sn); Log.e(TAG,"the cardsn is ===========" + sn); break; case GET_CARD_SN_ERR: case GET_CARD_IMSI_ERR: String info = (String) msg.obj; Toast.makeText(getApplicationContext(), info, Toast.LENGTH_LONG).show(); break; case GET_CARD_ICCID: cancelProg(); String iccid = (String) msg.obj; tv_ICCID.setText(iccid); Log.e(TAG,"the iccid is ===========" + iccid); break; case GET_CARD_IMSI: cancelProg(); String IMSI = (String) msg.obj; tv_cardInfo.setText(IMSI); Log.e(TAG,"the imsi is ===========" + IMSI); break; case GET_CARD_SMSP: cancelProg(); String rSMSP = (String) msg.obj; tv_SMSP.setText(rSMSP); Log.e(TAG,"the SMSP is ===========" + rSMSP); break; case WRITE_CARD_RESULT: cancelProg(); String writeResult = (String) msg.obj; //tv_sendData.setText(""); tv_sendData.setText(writeResult); Log.e(TAG,"the writeResult is ===========" + writeResult); break; case DEVICE_REGISTER_RESULT: String deviceRegisterResult = (String)msg.obj; mEditReceive.setText(deviceRegisterResult); Log.d(TAG,"设备注册成功:" + deviceRegisterResult); break; case DEVICE_REGISTER_ERR: String deviceRegisterErr = (String)msg.obj; mEditReceive.setText(deviceRegisterErr); Log.d(TAG,"设备注册失败:" + deviceRegisterErr); break; default: break; } } }; This Handler class should be static or leaks might occur (anonymous android. os. Handler)
04-02
接下来,我将从代码实现的角度来为大家详细的解析Handler-Looper-MessageQueue模型 Message.java package MyMessage; import MyHandler.Handler; public class Message { public int what; public Object obj; public Handler target; public long when; public Message next; } MessageQueue.java package MyMessageQueue; import MyMessage.Message; public class MessageQueue { private Message head; // 入队方法; public synchronized void enqueueMessage(Message msg, long delayMillis) { msg.when = System.currentTimeMillis() + delayMillis; // 空队列 或 新的最早消息; if (head == null || msg.when < head.when) { msg.next = head; head = msg; notify(); return; } Message p = head; while (p.next != null && p.next.when <= msg.when) { p = p.next; } msg.next = p.next; p.next = msg; } // 出队方法; public synchronized Message next() { for (;;) { long now = System.currentTimeMillis(); if (head == null) { waitUninterruptibly(0); continue; } long diff = head.when - now; if (diff <= 0) { Message m = head; head = m.next; m.next = null; return m; } waitUninterruptibly(diff); } } private void waitUninterruptibly(long millis) { boolean interrupted = false; try { while (true) { try { if (millis == 0) { wait(); } else { wait(millis); } return; } catch (InterruptedException e) { interrupted = true; } } } finally { if (interrupted) Thread.currentThread().interrupt(); } } } Hander.java package MyHandler; import MyLooper.Looper; import MyMessage.Message; import MyMessageQueue.MessageQueue; public class Handler { private final Looper mLooper; private final MessageQueue mQueue; public Handler() { this(Looper.myLooper()); } public Handler(Looper looper) { if (looper == null) throw new RuntimeException("Can't create Handler inside thread without Looper"); mLooper = looper; mQueue = looper.mQueue; } public void sendMessage(Message msg) { msg.target = this; mQueue.enqueueMessage(msg, 0); } public void sendMessageDelayed(Message msg, long delayMillis) { msg.target = this; mQueue.enqueueMessage(msg, delayMillis); } public void post(Runnable r) { Message m = new Message(); m.obj = r; sendMessage(m); } public void dispatchMessage(Message msg) { if (msg.obj instanceof Runnable) { ((Runnable) msg.obj).run(); } else { handleMessage(msg); } } public void handleMessage(Message msg) { } } Looper.java package MyLooper; import MyMessage.Message; import MyMessageQueue.MessageQueue; public class Looper { private static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>(); public final MessageQueue mQueue; private Looper() { mQueue = new MessageQueue(); } public static void prepare() { if (sThreadLocal.get() != null) { throw new IllegalStateException("Only one Looper per thread"); } sThreadLocal.set(new Looper()); } public static Looper myLooper() { return sThreadLocal.get(); } public static void loop() { Looper me = myLooper(); if (me == null) throw new IllegalStateException("No Looper; call prepare() first"); for (;;) { try { Message msg = me.mQueue.next(); if (msg == null) continue; msg.target.dispatchMessage(msg); } catch (Exception e) { Thread.currentThread().interrupt(); break; } } } } Demo.java import MyLooper.Looper; import MyMessage.Message; import MyHandler.Handler; public class Demo { public static void main(String[] args) { // 创建并启动工作线程 new WorkerThread("WorkerThread").start(); // 给主线程一点时间确保工作线程初始化完成 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } // 主线程发送消息 System.out.println("MainThread: 准备发送消息"); WorkerThread.handler.sendMessage(WorkerThread.obtainMessage(1, "普通消息")); WorkerThread.handler.sendMessageDelayed(WorkerThread.obtainMessage(2, "延迟消息"), 3000); WorkerThread.handler.post(() -> System.out.println("WorkerThread: 执行Runnable任务 - " + Thread.currentThread().getName()) ); System.out.println("MainThread: 所有消息已发送"); } } class WorkerThread extends Thread { public static Handler handler; // 静态便于主线程访问 public WorkerThread(String name) { super(name); } @Override public void run() { // 初始化Looper和Handler Looper.prepare(); handler = new Handler() { @Override public void handleMessage(Message msg) { // 处理消息 System.out.println(getName() + ": 收到消息 - what=" + msg.what + ", obj=" + msg.obj); } }; System.out.println(getName() + ": Looper已准备, 等待消息..."); Looper.loop(); // 开始消息循环 } // 辅助方法创建消息 public static Message obtainMessage(int what, Object obj) { Message msg = new Message(); msg.what = what; msg.obj = obj; return msg; } }
最新发布
08-05
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值