请讲解这段实现按钮文字颜色延迟修改的Android Java代码
代码逻辑详解
这段是Android平台的Java代码,核心功能是实现延迟1秒后将按钮文字颜色设置为透明,逐段逻辑拆解如下:
1. 异步工作线程初始化部分
HandlerThread handlerThread = new HandlerThread("showText"); handlerThread.start(); Handler handler = new Handler(handlerThread.getLooper());
HandlerThread是Android封装的自带消息循环(Looper)的线程类,这里首先创建了名为showText的工作线程,和普通线程不同,它内部自带消息队列,可以处理异步/延时任务。- 调用
start()启动线程后,线程内部的Looper才会完成初始化,开始循环监听消息队列的任务。 - 最后创建Handler实例,绑定工作线程的Looper,后续通过这个Handler投递的所有任务,都会被放到工作线程的消息队列中,在工作线程执行,不会阻塞主线程的UI交互。
2. 定时任务定义部分
Runnable runnable = new Runnable() { int i = 0; @Override public void run() { i++; handler.postDelayed(this, 1000); if (i > 1) button.setTextColor(getResources().getColor(android.R.color.transparent)); } }; handler.post(runnable);
- 这里创建了一个匿名Runnable任务实例,内部定义了成员变量
int i = 0,注意这个i是Runnable实例的成员属性,不是run方法内的局部变量,所以每次run方法执行时,i会保留上一次的数值,不会被重置。 - 首次调用
handler.post(runnable)会立刻把任务投递到工作线程执行,不需要等待延迟。 - run方法的执行逻辑:
- 先执行
i++,每次任务触发时计数加1 - 调用
handler.postDelayed(this, 1000),把当前Runnable自身再次投递到消息队列,设置1000毫秒(1秒)后执行,这行代码实现了每1秒触发一次任务的循环定时器效果 - 条件判断
i > 1:第一次执行run时i从0变为1,不满足条件,不会修改按钮属性;第二次执行run时i变为2,满足条件,就会把按钮的文字颜色设置为透明。
- 先执行
注意事项
Android要求所有UI控件的修改操作必须在主线程执行,这段代码的Runnable运行在工作线程,直接调用button.setTextColor实际运行时会抛出CalledFromWrongThreadException异常。如果要修复这个问题,可以将修改UI的部分切到主线程执行,比如把修改颜色的代码替换为:
button.post(() -> button.setTextColor(getResources().getColor(android.R.color.transparent)));
内容的提问来源于stack exchange,提问作者moustafa
相关产品推荐
相关产品推荐

