Исключение нулевого указателя в JobIntentService onDestroy

У меня возникла проблема с JobIntentService в ОС Android 8.1 с подписанным apk. Где он отлично работает с отладочной версией. Пробовал с несколькими вещами, но не смог найти решение для этого. Вот журнал сбоев, который я получил от Crashalytics.

java.lang.RuntimeException: Unable to stop service com.app.xmpp.XmppService@241c51c6: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.JobIntentService$WorkEnqueuer.serviceProcessingFinished()' on a null object reference

        at android.app.ActivityThread.handleStopService(ActivityThread.java:3284)

        at android.app.ActivityThread.access$2300(ActivityThread.java:188)

        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1633)

        at android.os.Handler.dispatchMessage(Handler.java:111)

        at android.os.Looper.loop(Looper.java:210)

        at android.app.ActivityThread.main(ActivityThread.java:5839)

        at java.lang.reflect.Method.invoke(Native Method)

        at java.lang.reflect.Method.invoke(Method.java:372)

        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113)

        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879)

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.JobIntentService$WorkEnqueuer.serviceProcessingFinished()' on a null object reference
        at android.support.v4.app.JobIntentService.onDestroy(JobIntentService.java:479)
        at com.app.xmpp.XmppService.onDestroy(XmppService.java:91)
        at android.app.ActivityThread.handleStopService(ActivityThread.java:3265)
        at android.app.ActivityThread.access$2300(ActivityThread.java:188) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1633) 
        at android.os.Handler.dispatchMessage(Handler.java:111) 
        at android.os.Looper.loop(Looper.java:210) 
        at android.app.ActivityThread.main(ActivityThread.java:5839) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879) 

Помогите мне, если кто-то сталкивался с подобными проблемами с JobIntentService.

Обратите внимание, что эту проблему нельзя решить с помощью обработки исключения Nullpointer, потому что NPE происходит в JobIntentService, который является частью Android Framework, и мы не можем его изменить, особенно это происходит только в Signed APK.

Служба XMPP OnDestroy

@Override
    public void onDestroy() {
        super.onDestroy();

        MyXMPP.instance=null;
        MyXMPP.instanceCreated=false;

        MyXMPP.connection.disconnect();
        xmppConnectionCheckHandler.removeCallbacks(xmppConnectionCheckRunnable);

        System.out.println("--------------Xmpp Service Stopped-----------");
    }

Заранее спасибо.


person Nama    schedule 20.11.2018    source источник
comment
Это НПЭ. Похоже, что WorkEnqueuer в XmppService в строке 91 равно нулю. Покажите нам некоторый код и отметьте конкретную строку, в которой выбрасываются исключения.   -  person Andrey Busik    schedule 20.11.2018
comment
Возможный дубликат Что такое исключение NullPointerException и как его исправить?   -  person Gokul Nath KP    schedule 20.11.2018
comment
Не могли бы вы показать свой класс JobIntentService, чтобы мы могли изучить код? :)   -  person Brandon    schedule 20.11.2018
comment
WorkerEnqueuer не является частью XmppService, это часть класса android.support.v4.app.JobIntentService из Android Framework.   -  person Nama    schedule 20.11.2018
comment
@Nama Да, экземпляр WorkEnqueuer равен нулю в XmppService в строке 91.   -  person Andrey Busik    schedule 20.11.2018
comment
Хорошо, не могли бы вы показать нам, что происходит с XmppService.java:91?   -  person Andrey Busik    schedule 20.11.2018
comment
@AndreyBusik, в вопрос добавлен код службы Xmpp.   -  person Nama    schedule 20.11.2018


Ответы (1)


Из JobIntentService класса:

@Override
public void onDestroy() {
    super.onDestroy();
    if (mCompatQueue != null) {
        synchronized (mCompatQueue) {
            mDestroyed = true;
            mCompatWorkEnqueuer.serviceProcessingFinished(); //line 479
        }
    }
}

@Override
public void onCreate() {
    super.onCreate();
    if (DEBUG) Log.d(TAG, "CREATING: " + this);
    if (Build.VERSION.SDK_INT >= 26) {
        mJobImpl = new JobServiceEngineImpl(this);
        mCompatWorkEnqueuer = null;
    } else {
        mJobImpl = null;
        ComponentName cn = new ComponentName(this, this.getClass());
        mCompatWorkEnqueuer = getWorkEnqueuer(this, cn, false, 0);
    }
}

Выполняете ли вы какие-либо манипуляции с mCompatWorkEnqueuer или mCompatQueue в своем подклассе? Скажем, например, установить для него null или super.onCreate() вызов?


Обратите внимание, что выполнение строки 479 зависит от наличия значения mCompatQueue. Также mCompatWorkEnqueuer устанавливается на null в onCreate для API 26 (8.0) и выше.

person Andrey Busik    schedule 20.11.2018
comment
Нет .. Я вообще не использую компонент mCompatWorkEnqueuer в своем классе .. кажется, что используется только JobIntentService - person Nama; 20.11.2018
comment
@Nama Вы можете попробовать переместить строку super.onDestroy() в самый низ метода onDestroy() - person Andrey Busik; 20.11.2018
comment
@Nama Вы также не устанавливаете значение mCompatQueue? - person Andrey Busik; 20.11.2018
comment
Я попытался сдвинуть его вниз. Это не сработало. Да... нет необходимости устанавливать значение mCompatQueue. Просто нужно позвонить: enqueueWork(контекст, XmppService.class, JOB_ID, работа); - person Nama; 20.11.2018