关于Handler中的sendEmptyMessage和sendEmptyMessageDelayed的运行流程

lewesly 2015-06-15 10:33:00
关于如下代码,在第28行的onFinishInflate()方法内,当系统加载完界面后执行本方法,“timerHandler.sendEmptyMessage(0);”是向timeHandler发送一个Value为“0”的空消息。“timerHandler.sendEmptyMessageDelayed(0, 1000);”Value为“0”的空消息延迟1秒。“refreshTime();”方法刷新当前TextView显示的时间。这三个语句如何调用的,我不理解系统走的流程。求各位帮忙解释下。最好带我走一边流程。
package com.liuyuan.clock;

import java.util.Calendar;

import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class TimeView extends LinearLayout {
private TextView tvTime;

public TimeView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public TimeView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public TimeView(Context context) {
super(context);
}

@Override
protected void onFinishInflate() {
super.onFinishInflate();

tvTime = (TextView) findViewById(R.id.tvTime);
timerHandler.sendEmptyMessage(0);
}

@Override
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
if (visibility == View.VISIBLE) {
timerHandler.sendEmptyMessage(0);
} else {
timerHandler.removeMessages(0);
}
}

private void refreshTime() {
Calendar c = Calendar.getInstance();
tvTime.setText(String.format("%d:%d:%d", c.get(Calendar.HOUR_OF_DAY),
c.get(Calendar.MINUTE), c.get(Calendar.SECOND)));
}

private Handler timerHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
refreshTime();
if (getVisibility() == View.VISIBLE) {
timerHandler.sendEmptyMessageDelayed(0, 1000);
}
};
};

}
...全文
11396 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shirley@@@ 2018-07-02
  • 打赏
  • 举报
回复
我也是在用到sendEmptyMessage,和sendEmptyMessageDelayed的时候出了问题,多次调了延迟方法但是图片的切换速度感觉错乱了一样。求解决
qq_36782784 2016-12-27
  • 打赏
  • 举报
回复
引用 4 楼 radar333 的回复:
handle sendEmptyMessage会不停的发消息吗???求解
这个是不会不停发消息的;注意 @Override protected void onFinishInflate() { super.onFinishInflate(); tvTime = (TextView) findViewById(R.id.tvTime); timerHandler.sendEmptyMessage(0); } 这里向handler发送了一次消息 private Handler timerHandler = new Handler() { public void handleMessage(android.os.Message msg) { refreshTime(); if (getVisibility() == View.VISIBLE) { timerHandler.sendEmptyMessageDelayed(0, 1000); } }; }; 这里接受消息后又发送消息;也就是handler自己给自己发消息,这样就形成了死循环; 但这样会导致handler的引用会一直存在 所以在 protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if (visibility == View.VISIBLE) { timerHandler.sendEmptyMessage(0); } else { timerHandler.removeMessages(0); } } 这里移除了消息的发送; 这些消息中 0 就代表了一种消息;
oliverdon 2016-05-27
  • 打赏
  • 举报
回复
handle sendEmptyMessage会不停的发消息吗???求解
phoenxior 2016-03-08
  • 打赏
  • 举报
回复
我也刚好看到这里,为什么sendEmptyMessage会不停地发消息?????
开发者_android 2015-06-15
  • 打赏
  • 举报
回复
这个0的意思是what的值,你可以传随便数字,在handleMessage方法中,你可以用switch来区分不同的传值来做不同的事。 textview更新,你就timerHandler.sendEmptyMessage(1)再在case 1:中实现更新操作。
迷茫的小码 2015-06-15
  • 打赏
  • 举报
回复
就有点像的标识的用意

80,359

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧