Android中Handler使用postDelayed方法不生效

今天遇到一个比较奇怪的问题,在我们所用的客户端框架中,使用Handler执行一个任务,基本用法如下,但调试时发现并没有执行mRunnable。


private Handler mHandler = new Handler();
……
public boolean dispatchTouchEvent(){
……
mHandler.postDelayed(mRunnable, 500);
……
}


但是,当我修改一下,将mHandler修改为局部变量,如下,却发现mRunnable正常执行了。


……
public boolean  dispatchTouchEvent(){
 ……
 Handler mHandler = new Handler();
 mHandler.postDelayed(mRunnable, 500);
 ……
}

请教了下大牛,然后才发现我这个控件并没有运行在UI线程中,而查看Handler源代码,就会发现Handler能正常运行需要一个Looper,而Handler()这个构造方法通过Looper.myLooper()方法获取一个Looper对象,以便将消息传递给相应的目标。在上面的写法中,如果我将其作为类变量,Handler创建时并未在主线程中,没有合适的Looper对象,导致虽然我使用postDelayed方法发送了一个任务,但这个任务并未被执行。有关Handler和Looper的详细说明可以参考这篇文章:Android Looper和Handler 。既然是Looper导致的,可以修改一下创建Handler对象的方式,传入一个Looper对象,如下,即传入主线程的Looper,即可解决该问题


<pre>private Handler mHandler = new Handler(Looper.getMainLooper());
……
public boolean dispatchTouchEvent(){
……
mHandler.postDelayed(mRunnable, 500);
……
}</pre>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值