首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

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

2013-09-12 
解决Android中Cant create handle inside thread问题[java] view plaincopyprint?new Thread(){public voi

解决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(this, 100);  
  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(this, 100);  
  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() {@Overridepublic 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

热点排行