当前位置: 代码迷 >> Android >> 解决Android中Can't create handle inside thread有关问题
  详细解决方案

解决Android中Can't create handle inside thread有关问题

热度:168   发布时间:2016-04-28 08:10:30.0
解决Android中Can't create handle inside thread问题
[java] view plaincopyprint?
  1. new Thread()  
  2. {  
  3.     public void run()  
  4.     {  
  5.              .....  
  6.      }  
  7. }.start();  

如果在上述代码中省略号处面创建一个Dialog的话会出现Can't create handle inside thread这样的错误,所以改用下述message形式的,下述是一个开发项目中具体的例子。

[java] view plaincopyprint?
  1. private void showStatusDialogThread() {  
  2.         mHandler = new Handler() {  
  3.             @Override  
  4.             public void handleMessage(Message msg) {  
  5.                 if (status != null) {  
  6.                     if (status.equals(SyncStatus.Success)) {  
  7.                         // 更新本地保存的lastSyncTime为当前时间  
  8.                         UpdateLocalLastSyncTime(System.currentTimeMillis());  
  9.                     }  
  10.                     showStatusDialog(status);  
  11.                     mHandler.removeCallbacks(mRunnable);  
  12.                 }  
  13.                 super.handleMessage(msg);  
  14.             }  
  15.         };  
  16.         mRunnable = new Runnable() {  
  17.             @Override  
  18.             public void run() {  
  19.                 mHandler.postDelayed(this100);  
  20.                 Message message = new Message();  
  21.                 mHandler.sendMessage(message);  
  22.             }  
  23.         };  
  24.         mHandler.post(mRunnable);  
  25.     }  

其中

[java] view plaincopyprint?
  1. showStatusDialog(status);  
是调用一个显示Dialog的自定义的方法。

这种发送message的方式模型抽取出来就是下面的形式:

[java] view plaincopyprint?
  1. {  
  2.         mHandler = new Handler() {  
  3.             @Override  
  4.             public void handleMessage(Message msg) {  
  5.                 //执行的具体方法,例如创建Dialog,计数等  
  6.                                 ......  
  7.                 super.handleMessage(msg);  
  8.             }  
  9.         };  
  10.         mRunnable = new Runnable() {  
  11.             @Override  
  12.             public void run() {  
  13.                 //设置延迟时间间隔  
  14.                 mHandler.postDelayed(this100);  
  15.                 Message message = new Message();  
  16.                 mHandler.sendMessage(message);  
  17.             }  
  18.         };  
  19.         mHandler.post(mRunnable);  
  20.     }  



然后在其他某处调用

[java] view plaincopyprint?
  1. mHandler.removeCallbacks(mRunnable);  

就可取消此message的发送。


其实这里发送message也是一种线程,相当于设置一个定时器,每隔一段时间执行某些代码一样。


下面是这个用法的另一个写法

我觉的更简单理解一些

	Handler mHideHandler = new Handler();	Runnable mHideRunnable = new Runnable() {		@Override		public void run() {			mSystemUiHider.hide();		}	};	/**	 * Schedules a call to hide() in [delay] milliseconds, canceling any	 * previously scheduled calls.	 */	private void delayedHide(int delayMillis) {		mHideHandler.removeCallbacks(mHideRunnable);		mHideHandler.postDelayed(mHideRunnable, delayMillis);	}

只需要在主线程调用delayedHide就可以实现


注:本文章参照http://blog.csdn.net/cangkukuaimanle/article/details/6937503

  相关解决方案