Android handler 报错处理Can't create handler inside thread that has not called Looper.prepare()

问题:

写了一个sdk给其他人用,提供一个回调函数,函数使用了handler处理消息

// handler监听网络请求,完成后操作回调函数
        final Handler trigerGfHandler = new Handler() {
            public void handleMessage(Message msg) {
                listener.onGeofenceTrigger(gfMatchIds);
            }
        };

在使用这个sdk提供的函数时,报错:

01-02 15:46:10.498: E/AndroidRuntime(16352): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

使用方式是在service中使用。在activity中使用正常。

 

问题解决:

在调用handler的方法前执行Looper.prepare()。Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用。

因为activity的主线程是自己创建消息队列的,所以在Activity中新建Handler时,不需要先调用Looper.prepare()

代码:

 

Looper.prepare();
        // handler监听网络请求,完成后操作回调函数
        final Handler trigerGfHandler = new Handler() {
            public void handleMessage(Message msg) {
                listener.onGeofenceTrigger(gfMatchIds);
            }
        };
Looper.loop();

 

 参考:http://www.myexception.cn/mobile/410671.html

========================

新问题:

当此函数在activity中调用时,也会报错,因为activity已经自动创建了消息队列。所以重复创建会出错。

查看官网关于Looper的例子:

class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };

          Looper.loop();
      }
  }

将handler写在一个线程中。使此消息队列与主线程中消息队列分离。

最终写法为:

class LooperThread extends Thread {
            
            public void run() {
                Looper.prepare();
                trigerGfHandler = new Handler() {
                    public void handleMessage(Message msg) {
                        // process incoming messages here
                        listener.onGeofenceTrigger(gfMatchIds);
                    }
                };
                Looper.loop();
            }
        }
        
        LooperThread looper = new LooperThread();
        looper.start();

 

 

 

 

 

 

 

posted @ 2014-01-02 16:18  Sudawei  阅读(17347)  评论(0编辑  收藏  举报