1月 202016
 

今天遇到一个比较奇怪的问题,在我们所用的客户端框架中,使用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>

 


  One Response to “Android中Handler使用postDelayed方法不生效”

  1. Thank you

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)