Нулевое исключение HandlerThread - Android

Я использую ThreadHandler в своем приложении таким образом,

public class MessageThread extends HandlerThread {
    Handler mHandler;

    public MessageThread() {
        super("Message Thread");
    }

    public void queueProcessMessage(msgObject mObj) {

        mHandler.obtainMessage(PROCESS_MESSAGE, mObj).sendToTarget();

    }

    @Override
    protected void onLooperPrepared() {

       Commons.logIt("OnLoopPrep");

        mHandler = new Handler() {

            @Override
            public void handleMessage(Message msg) {

                switch (msg.what) {


                    case PROCESS_MESSAGE:
                        process_message((msgObject) msg.obj);
                        break;
                    default:

                        break;

                }
            }
        };
    }

   process_message(msgObject obj) {
        //Do stuff
   }

}

И я инициализирую его в onCreate() так,

public void onCreate(Bundle savedInstanceState) {

    MessageThread mThread = new MessageThread();
    mThread.start();
    mThread.getLooper();
    if (mThread != null)
        mThread.queueProcessMessage(Object);// this is the line the compiler is pointing at.
}

И это работает нормально, проблема в том, что мне нужно было добавить что-то еще, где я должен начать другое действие, ожидающее результата, поэтому мне пришлось инициализировать / использовать его, как показано ниже, так как onActivityResult вызывается перед onCreate, когда я запускаю действие для результата на этот раз я получаю ошибку

java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Message android.os.Handler.obtainMessage(int, java.lang.Object)' on a null object reference

,

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == IMAGE_ACTIVITY_REQUEST_CODE) {

        if (resultCode == Activity.RESULT_OK) {
           MessageThread mThread = new MessageThread();
           mThread.start();
           mThread.getLooper();

           mThread.queueProcessMessage(new msgObject("stuff"));
        }  

    }
  }

Похоже, что поток не получает инициализации, что я здесь пропускаю?

Изменить 1,

После обсуждения этой проблемы, похоже, что инициализация обработчика занимает немного времени, я сделал это, это уродливо, но работает, есть идеи, что мне делать?

    public void queueProcessMessage(msgObject mObj) {
         while (mHandler == null)
            Log.i(TAG, "Not init yet"); //It keeps on looping here
        mHandler.obtainMessage(PROCESS_MESSAGE, mObj).sendToTarget();

    }

0 ответов

Другие вопросы по тегам