【遇见Android bug】Only one Looper may be created per thread

时间:2024-11-17 18:35:30
09-02 12:11:19.700: E/AndroidRuntime(16093): Process: , PID: 16093
09-02 12:11:19.700: E/AndroidRuntime(16093): : Only one Looper may be created per thread
09-02 12:11:19.700: E/AndroidRuntime(16093): at (:77)
09-02 12:11:19.700: E/AndroidRuntime(16093): at (:72)
09-02 12:11:19.700: E/AndroidRuntime(16093): at (:54)
09-02 12:11:19.700: E/AndroidRuntime(16093): at (:733)
09-02 12:11:19.700: E/AndroidRuntime(16093): at (:95)
09-02 12:11:19.700: E/AndroidRuntime(16093): at (:136)
09-02 12:11:19.700: E/AndroidRuntime(16093): at (:5262)
09-02 12:11:19.700: E/AndroidRuntime(16093): at (Native Method)
09-02 12:11:19.700: E/AndroidRuntime(16093): at (:515)
09-02 12:11:19.700: E/AndroidRuntime(16093): at $(:851)
09-02 12:11:19.700: E/AndroidRuntime(16093): at (:667)
09-02 12:11:19.700: E/AndroidRuntime(16093): at (Native Method)

遇到这个问题的情景是这样的:我创建了一个thread,同时创建了两个handler:mUIhandler和 handler ,在onResume方法中使用如下代码:
<span style="font-size:14px;">(mLivingRefreshRunnable, 30 * 1000);</span>
同时在onPause中使用如下代码:
<span style="font-size:14px;">(mLivingRefreshRunnable)</span>

此时运行程序就导致了上述bug:Only one Looper may be created per thread。

简单来说这个问题是因为一个线程只能捆绑一个Looper,而上述代码中明显是两个handler即两个Looper对应于一个thread。
解决方式很简单,启动线程和移除线程都采用一个handler处理即可。

出现这个问题,其实是由于自己粗心所致,mUIhandler是本类创建的,而handler 是在父类中创建的;因平时常用就是(...),所以这次也顺手写成了
<span style="font-size:14px;">(mLivingRefreshRunnable);</span>

同时附上一篇:Android处理程序:Handler Looper Message源码研究