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

[java]  view plain copy print ?
  1. new Thread()  
  2. {  
  3.     public void run()  
  4.     {  
  5.              .....  
  6.      }  
  7. }.start();  

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

[java]  view plain copy print ?
  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 plain copy print ?
  1. showStatusDialog(status);  
是调用一个显示Dialog的自定义的方法。

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

[java]  view plain copy print ?
  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 plain copy print ?
  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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值