读书人

解决Android中Canamp;#39;t create handl

发布时间: 2013-09-12 22:07:00 作者: rapoo

解决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. //执行的具体方法,例如创—ialog,计数等
  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

读书人网 >Android

热点推荐