dispatchMessage处理程序中的java.lang.NullPointerException
我是Android编程新手,在一个服务的处理程序中有一个零星的错误。日志错误为: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.
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!,就我所知,您说在executesrv.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<---+