java.lang.NullPointerException: Attempt to read from field 'android.os.MessageQueue android.os.Loope

源代码

修改前:

 private synchronized void initialize(Bitmap.Config config)
    {
        onSetImageStart();

        if (mLoadingHandler != null) {
            mLoadingHandler.removeCallbacks(mInstanceDecoderRunnable);
            mLoadingHandler.removeCallbacks(mCacheBitmapRunnable);
            mLoadingHandler.removeCallbacks(mBitmapGrid.mDecodeThumbRunnable);
        }

        mLoadingThread.quit();
        if (mDecoder != null) {
            mDecoder.recycle();
            mDecoder = null;
        }

        mBitmapConfig = config == null ? Bitmap.Config.RGB_565 : config;
        mLoadingThread.start();
        mLoadingHandler = new Handler(mLoadingThread.getLooper());


    }

修改后: 

    private synchronized void initialize(Bitmap.Config config)
    {
        onSetImageStart();

        if (mLoadingHandler != null) {
            mLoadingHandler.removeCallbacks(mInstanceDecoderRunnable);
            mLoadingHandler.removeCallbacks(mCacheBitmapRunnable);
            mLoadingHandler.removeCallbacks(mBitmapGrid.mDecodeThumbRunnable);
        }

        mLoadingThread.quit();
        if (mDecoder != null) {
            mDecoder.recycle();
            mDecoder = null;
        }

        mBitmapConfig = config == null ? Bitmap.Config.RGB_565 : config;
        mLoadingThread = new HandlerThread(THREAD_NAME + this.hashCode());
        mLoadingThread.start();
        mLoadingHandler = new Handler(mLoadingThread.getLooper());


    }

HandleThread中quit()方法:

  /**
     * Quits the handler thread's looper.
     * 

* Causes the handler thread's looper to terminate without processing any * more messages in the message queue. *

* Any attempt to post messages to the queue after the looper is asked to quit will fail. * For example, the {@link Handler#sendMessage(Message)} method will return false. *

* Using this method may be unsafe because some messages may not be delivered * before the looper terminates. Consider using {@link #quitSafely} instead to ensure * that all pending work is completed in an orderly manner. *

* * @return True if the looper looper has been asked to quit or false if the * thread had not yet started running. * * @see #quitSafely */ public boolean quit() { Looper looper = getLooper(); if (looper != null) { looper.quit(); return true; } return false; }

异常提示在调用mLoadingThread.getLooper()是空对象,因为在quit的时候已经将源Looper对象释放,所以已经为空,所以需要重新初始化

你可能感兴趣的:(Android)