Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dispatchMessage处理程序中的java.lang.NullPointerException_Java_Android_Android Handler - Fatal编程技术网

dispatchMessage处理程序中的java.lang.NullPointerException

dispatchMessage处理程序中的java.lang.NullPointerException,java,android,android-handler,Java,Android,Android Handler,我是Android编程新手,在一个服务的处理程序中有一个零星的错误。日志错误为: java.lang.NullPointerException at com.rafag.taxialerta.RadarTaxiService$buzonMensajeTareaUbicaciones.handleMessage(RadarTaxiService.java:105) at android.os.Handler.dispatchMessage(Handler.java:106) at android.

我是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;
            }
        }
    }
buzonMapa在onBind处初始化到服务:

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

我曾经有过上百次这样的错误,但我无法找到一位赞助人来重现它

一般流程如下:

Activity ----------------> Service --------------------> Thread
        buzonMapa<------------+  puenteTareaUbicaciones<---+ 
活动----------------->服务----------------->线程

Buzonmap是一个弱参照物。因此,您无法确定srv是否为空或GCe'd。检查srv是否不为空。

我想我找到了导致此问题的可能原因。如果应用程序因任何原因崩溃,START_STICKY会自动重新创建服务,但对“Buzonmappa”的引用将丢失。

在将消息传递给handleMessage()之前,您应该检查消息是否为null,如果消息为null,这意味着我的活动不会向服务发送消息,服务也无法与活动进行通信。我将在main activity中添加服务连接的代码。
srv.buzonmappa
显然是空的,这是我的想法,但我不明白为什么可能。我在应用程序中只有一个点来启动服务并将值从活动发送到服务。我不明白你的答案,我检查srv是否为null,这是我要做的第一件事。”如果(srv==null){super.handleMessage(msg);return;}',它是一个weakreference,这是有原因的。当删除对对象的强引用时,android将删除引用。因此OP应该在引用值的每一步检查null。Ufff!,就我所知,您说在execute
srv.reciboSituacion(msg.what)之后两行srv可能为空就在输入之前尝试?
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);
    }
}
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<---+