• 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();
  • 相关阅读:
    【NOI1999、LOJ#10019】生日蛋糕(搜索、最优化剪枝、可行性剪枝)
    【NOI2016】区间
    【CodeForces688A】Opponents
    「LOJ10150」括号配对
    HDU6444(子段和、分情况比较)
    牛客练习赛41E(球的体积并)
    Codeforces 1154G(枚举)
    POJ1830(异或高斯消元)
    Codeforces 1114F(欧拉函数、线段树)
    牛客小白月赛13 G(双向搜索)
  • 原文地址:https://www.cnblogs.com/sudawei/p/3502074.html
Copyright © 2020-2023  润新知