Android 服务未初始化,返回NullPointerException
我试图在我的服务和活动设置之间建立双向沟通。为此,我像平常一样启动服务,在活动中向Messenger发送带有replyTo设置的消息,然后将其发送到我的服务。这样我就有了一个双向发送消息的参考。以下是我活动中的一些相关代码:Android 服务未初始化,返回NullPointerException,android,service,nullpointerexception,Android,Service,Nullpointerexception,我试图在我的服务和活动设置之间建立双向沟通。为此,我像平常一样启动服务,在活动中向Messenger发送带有replyTo设置的消息,然后将其发送到我的服务。这样我就有了一个双向发送消息的参考。以下是我活动中的一些相关代码: private Messenger mService = null; private final Messenger mMessenger = new Messenger(new IncomingHandler()); private ServiceConnection
private Messenger mService = null;
private final Messenger mMessenger = new Messenger(new IncomingHandler());
private ServiceConnection mConnection = new ServiceConnection()
{
public void onServiceConnected(ComponentName className, IBinder service)
{
mService = new Messenger(service);
mBound = true;
}
public void onServiceDisconnected(ComponentName className)
{
mService = null;
mBound = false;
}
};
private void initMessenger()
{
Message messageHandler = Message.obtain(null, NetworkService.MSG_GET_HANDLER, 0, 0);
messageHandler.replyTo = mMessenger; //Set the replyTo to give a reference
try
{
mService.send(messageHandler);
}
catch(RemoteException e)
{
e.printStackTrade();
}
catch(NullPointerException e)
{
e.printStackTrace(); //Why!!!
}
}
public void onCreate()
{
...
//Create the intent to start the network service
Intent iService = new Intent(this, NetworkService.class);
int[] connectionConfig = {CONNECTION_BT};
iService.putExtra(CONNECTION_CONFIG, connectionConfig);
bindService(iService, mConnection, Context.BIND_ABOVE_CLIENT);
startService(iService);
initMessenger();
}
当我尝试调用mService.send()时,会引发NullPointerException,很可能是因为mService当时为null。如果我将initMessenger()代码移动到按钮的OnClickListener中,它就可以正常工作,这就是混淆的地方。我应该在启动服务后等待一定时间才能使用它吗?是。只有当您知道自己已绑定到该服务时,才应使用该服务。 由于您在尝试绑定到服务后立即尝试使用该服务,因此不能保证您将连接到该服务。有时,服务可能会立即绑定,因此不会发生崩溃。有时需要更长的时间,因此您对
initMessenger()
的调用将导致您的NPE,因为该服务尚未连接
将您的
initMessenger()
调用移动到您的按钮单击,可以让您的服务时间绑定。此外,您应该检查以确保绑定(即使您给它时间),因为绑定可能会失败。只有当您知道自己已绑定到该服务时,才应使用该服务。
由于您在尝试绑定到服务后立即尝试使用该服务,因此不能保证您将连接到该服务。有时,服务可能会立即绑定,因此不会发生崩溃。有时需要更长的时间,因此您对initMessenger()
的调用将导致您的NPE,因为该服务尚未连接
将您的
initMessenger()
调用移动到您的按钮单击,可以让您的服务时间绑定。此外,您应该检查以确保您已绑定(即使您给它时间),因为绑定可能会失败为什么不在您的onServiceConnected()
方法中调用initMessenger()
?这样肯定会分配mService
。为什么不在onServiceConnected()
方法中调用initMessenger()
?这样肯定会分配mService
。mService
在此阶段为null
表明此时您的服务尚未调用onServiceConnection()
不幸的是,bindService()
实际上,服务启动时,bindService()
应返回true
,这意味着一旦代码通过此阶段,服务应启动或不启动。因此,在调用initMessenger()
之前,我会检查bindService()是否返回了true
,因为服务可能无法正确启动
也可能是onServiceConnected()
中的代码引发了异常(因为它可能是在工作线程上调用的,不会导致您的应用程序崩溃),您可能需要在日志中检查是否存在这种情况
此外,startService(iSeries设备)代码>在此上下文中是多余的,bindService()
启动服务,调用服务上的startService
,只需发送消息。mService
在此阶段为null
表明此时您的服务尚未调用onserviceconconnected()
不幸的是,bindService()
实际上,服务启动时,bindService()
应返回true
,这意味着一旦代码通过此阶段,服务应启动或不启动。因此,在调用initMessenger()
之前,我会检查bindService()是否返回了true
,因为服务可能无法正确启动
也可能是onServiceConnected()
中的代码引发了异常(因为它可能是在工作线程上调用的,不会导致您的应用程序崩溃),您可能需要在日志中检查是否存在这种情况
此外,startService(iSeries设备)代码>在此上下文中是多余的,bindService()
启动服务,对服务调用startService
,只需发送消息即可