Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.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
Android 服务未初始化,返回NullPointerException_Android_Service_Nullpointerexception - Fatal编程技术网

Android 服务未初始化,返回NullPointerException

Android 服务未初始化,返回NullPointerException,android,service,nullpointerexception,Android,Service,Nullpointerexception,我试图在我的服务和活动设置之间建立双向沟通。为此,我像平常一样启动服务,在活动中向Messenger发送带有replyTo设置的消息,然后将其发送到我的服务。这样我就有了一个双向发送消息的参考。以下是我活动中的一些相关代码: private Messenger mService = null; private final Messenger mMessenger = new Messenger(new IncomingHandler()); private ServiceConnection

我试图在我的服务和活动设置之间建立双向沟通。为此,我像平常一样启动服务,在活动中向Messenger发送带有replyTo设置的消息,然后将其发送到我的服务。这样我就有了一个双向发送消息的参考。以下是我活动中的一些相关代码:

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
,只需发送消息即可