java.lang.NullPointerException 在 Handler on dispatchMessage 中

java.lang.NullPointerException in Handler on dispatchMessage

我是 Android 编程的新手,我在服务的处理程序中遇到偶发错误。日志错误是:

java.lang.NullPointerException
at com.rafag.taxialerta.RadarTaxiService$buzonMensajeTareaUbicaciones.handleMessage(RadarTaxiService.java:105)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5212)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)

我的代码是:

private Handler puenteTareaUbicaciones;
    static class buzonMensajeTareaUbicaciones extends Handler {
        private final WeakReference<RadarTaxiService> wr;
        buzonMensajeTareaUbicaciones(RadarTaxiService srv) {
            wr = new WeakReference<>(srv);
        }
        @Override
        public void handleMessage(Message msg) {
            RadarTaxiService srv = wr.get();
            if (srv == null){
                super.handleMessage(msg);
                return ;
            }
            Message nuevoMsg = Message.obtain();
            switch (msg.what) {
                case PUENTE_OK:
                    srv.reciboSituacion(msg.what);
                    nuevoMsg.what = msg.what;
                    try {
                        srv.buzonMapa.send(nuevoMsg);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    super.handleMessage(msg);
                    break;
            }
        }
    }

第 105 行是:

srv.buzonMapa.send(nuevoMsg)

buzonMapa 在绑定到服务时初始化:

public IBinder onBind(Intent intent) {
    return buzonServicio.getBinder();
}

并且:

static class buzonMensajeMapa extends Handler {
    private final WeakReference<RadarTaxiService> wr;

    buzonMensajeMapa(RadarTaxiService srv) {
        wr = new WeakReference<>(srv);
    }

    @Override
    public void handleMessage(Message msg) {
        RadarTaxiService srv = wr.get();
        if (srv == null) {
            super.handleMessage(msg);
            return;
        }
        srv.buzonMapa = msg.replyTo;
        srv.miSituacionEs(msg.what);
    }
}

在主 activity 中,onServiceConnected:

public void onServiceConnected(ComponentName name, IBinder service) {
    buzonServicio = new Messenger(service);
    try {
        Message msg = Message.obtain();
        msg.replyTo = buzonActividad;
        buzonServicio.send(msg);
    } catch (RemoteException e) {
        //e.printStackTrace();
    }
}

这个错误我有一百次了,但我总是找不到赞助人来重现它。

一般流程是:

Activity ----------------> Service --------------------> Thread
        buzonMapa<------------+  puenteTareaUbicaciones<---+ 

有什么想法吗?

这是一个弱引用。所以你不能确定 srv 不为空或 GCe'd。检查srv是否不为空

我想我找到了这个问题的可能原因。如果应用程序因任何原因崩溃,服务将由 START_STICKY 自动重新创建,但对 'buzonMapa' 的引用将丢失。