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>

 

发布了155 篇原创文章 · 获赞 0 · 访问量 3933
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览