解决方案 »

  1.   

      主线程本身就有一个Looper  它已经调用了prepare()   你要去你自己开启的子线程调用prepare()
      

  2.   

    http://my.eoe.cn/lakeside/archive/15571.html
      

  3.   

    不是要在子线程里面创建Handler,而是在Service中创建Handler,但是不调用Looper.prepare也不对,调用也不对。
      

  4.   

    这样的话,这个thread会一直在后台运行着...   
      

  5.   

    thread 你可以不用就关掉的
      

  6.   

    大哥些你们都没有明白我的问题: 
    我不是要在子线程里面创建Handler,而是在Service中创建Handler,但是不调用Looper.prepare()也不对,调用也不对。
      

  7.   

    创建Looper以后 loop了么?需要写Looper.loop();
    一个Thread只可以set一个Looper,service默认是主线程,在Activity启动的时候已经loop起来了,所以会抛出异常。 private static void prepare(boolean quitAllowed) {
            if (sThreadLocal.get() != null) {
                throw new RuntimeException("Only one Looper may be created per thread");
            }
            sThreadLocal.set(new Looper(quitAllowed));
        }
      

  8.   

    Service 直接在oncreate里创建handler就可以啊。谁知道你怎么写的,无码无真相。
      

  9.   

    我知道了,并不是在Service中创建Handler异常,而是因为我在这个Service中启动了一个子线程,为了这个线程能够调用Service中m_handler的m_handler.sendMessage(), 把这个m_handler传给了子线程,在子线程中记录这个句柄,结果这个子线程中异常了。
      

  10.   

    其实是因为子线程中使用了LocationManager,而LocationManager中创建了Handler
      

  11.   

    如果在子线程的RUN方法中使用handler,要先looper.prepare()去创建looper,然后looper.loop(),否则会报错 
    public Handler(Callback callback, boolean async) {
            if (FIND_POTENTIAL_LEAKS) {
                final Class<? extends Handler> klass = getClass();
                if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
                        (klass.getModifiers() & Modifier.STATIC) == 0) {
                    Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
                        klass.getCanonicalName());
                }
            }        mLooper = Looper.myLooper();
            if (mLooper == null) {
                throw new RuntimeException(
                    "Can't create handler inside thread that has not called Looper.prepare()");
            }
            mQueue = mLooper.mQueue;
            mCallback = callback;
            mAsynchronous = async;
        }