android 线程中断的处理

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@40900d30 is not valid; is your activity running?
at android.view.ViewRoot.setView(ViewRoot.java:558)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.view.Window$LocalWindowManager.addView(Window.java:433)
at android.app.Dialog.show(Dialog.java:265)
at com.qt.qtmc.share.ShareContent$1.handleMessage(ShareContent.java:206)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:4333)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
at dalvik.system.NativeStart.main(Native Method)

以上是错误日志。在一个activity中主线程结束了,但是它开启的thread还在,此时,如果thread通过handler更新UI,就会出现上面的错误。这样就要考虑如何终止子线程。

终止子线程可以调用interrupt来终止,这个方法是安全的。而终止thread的方法有很多,最常见的,就是interrupt,设置标记终止。而设置标记的适用于线程的run方法里面有循环的。

interrupt也不是阻止所有的线程,要看线程的状态。这个中断方法可以将阻塞的线程唤醒过来, 但是注意 他不能将非阻塞的线程中断. 中断的同时,会抛出一个异常。幸运的是, SocketChannel.connect() .read() 阻塞方法都会接受中断,ClosedByInterruptException.InterruptedException.

同时测试了handler的removeMessages,这个只能移除等待处理的msg并不能停止所有的msg

所以如果interrupt没有终止线程,已经发出了msg, handler可以通过判断isFinishing来看activity是否运行,来做出相应的反应

上一篇:Java基础系列-Comparable和Comparator


下一篇:5-(基础入门篇)学会刷Wi-Fi模块固件(刷LUA版本固件)