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' 的引用将丢失。
我是 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' 的引用将丢失。