Android 当活动尝试与有界服务通信时发生nullpointerexception

Android 当活动尝试与有界服务通信时发生nullpointerexception,android,nullpointerexception,android-service,android-service-binding,Android,Nullpointerexception,Android Service,Android Service Binding,我试图让我的活动与正在运行的后台服务进行通信,但不断得到一个NullPointerException,这没有任何意义。。至少对我来说。希望其他人能找出问题所在 首先是我的LogCat输出: 03-17 20:16:56.390: E/AndroidRuntime(11563): FATAL EXCEPTION: main 03-17 20:16:56.390: E/AndroidRuntime(11563): java.lang.NullPointerException 03-17 20:16:

我试图让我的活动与正在运行的后台服务进行通信,但不断得到一个NullPointerException,这没有任何意义。。至少对我来说。希望其他人能找出问题所在

首先是我的LogCat输出:

03-17 20:16:56.390: E/AndroidRuntime(11563): FATAL EXCEPTION: main
03-17 20:16:56.390: E/AndroidRuntime(11563): java.lang.NullPointerException
03-17 20:16:56.390: E/AndroidRuntime(11563):    at com.takenumber.TakeNumber.sendMessageToService(TakeNumber.java:240)
03-17 20:16:56.390: E/AndroidRuntime(11563):    at com.takenumber.TakeNumber$2.onClick(TakeNumber.java:334)
03-17 20:16:56.390: E/AndroidRuntime(11563):    at android.view.View.performClick(View.java:4204)
03-17 20:16:56.390: E/AndroidRuntime(11563):    at android.view.View$PerformClick.run(View.java:17355)
03-17 20:16:56.390: E/AndroidRuntime(11563):    at android.os.Handler.handleCallback(Handler.java:725)
03-17 20:16:56.390: E/AndroidRuntime(11563):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-17 20:16:56.390: E/AndroidRuntime(11563):    at android.os.Looper.loop(Looper.java:137)
03-17 20:16:56.390: E/AndroidRuntime(11563):    at android.app.ActivityThread.main(ActivityThread.java:5041)
03-17 20:16:56.390: E/AndroidRuntime(11563):    at java.lang.reflect.Method.invokeNative(Native Method)
03-17 20:16:56.390: E/AndroidRuntime(11563):    at java.lang.reflect.Method.invoke(Method.java:511)
03-17 20:16:56.390: E/AndroidRuntime(11563):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
03-17 20:16:56.390: E/AndroidRuntime(11563):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
03-17 20:16:56.390: E/AndroidRuntime(11563):    at dalvik.system.NativeStart.main(Native Method)
我在活动中所做的:

要启动服务并将其绑定,请执行以下操作:

                    serviceIntent = new Intent(context, ServerService.class);                   
                    serviceIntent.putExtra("messageType", StaticValues.MESSAGE_START_SERVICE); 
                    serviceIntent.putExtra("devicetype", StaticValues.DEVICE_TAKENUMBER); 
                    serviceIntent.putExtra("MESSENGER", new Messenger(messageHandler));
                    startService(serviceIntent);
                    bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
并创建serviceConnection:

private ServiceConnection serviceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            if (isServer) {
                boundServiceServer = ((ServerService.CustomBinder) service).getService();
            } else {
                boundServiceClient = ((ClientService.CustomBinder) service).getService();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            boundServiceClient = null;
            boundServiceServer = null;
        }
    };
然后我有一个单击侦听器,用于调用我的服务中的方法的按钮:

categoryButton.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                            Button buttonClicked = (Button)v;
                            int categoryID = v.getId();
                            String categoryTitle = buttonClicked.getText().toString();

                            // TODO: Change to send only to showline devices
                            boundServiceServer.getMessagesFromUI(StaticValues.MESSAGE_NUMBER_TAKEN + StaticValues.MESSAGE_DELIMITER + categoryID + StaticValues.MESSAGE_DELIMITER + categoryTitle);

                        }
                    });
在我的服务中,我这样做: 创建一个“
活页夹”
”:

我的服务中的方法
getMessagesFromUI()
(从活动中接收字符串)如下所示:

public void getMessagesFromUI(String message) {
    // DO stuff
}
当然
onBind()
方法操作系统被覆盖:

@Override
public IBinder onBind(Intent arg0) {
    return binder;
}
我真的希望有人能解决这个问题,因为我现在完全迷路了。 如果你需要更多的信息,尽管问

编辑:
第240行(NullPointerException)
这是一个:

boundServiceServer.getMessagesFromUI(messageString);
其他信息:

我已经将我的一些代码粘贴到了以下地址的pastebin上

TakeNumber活动如下:

服务器服务在这里:

我还在代码中插入了“syso”,以了解发生了什么。这是在此之后的logcat输出:

03-18 14:23:05.740: D/dalvikvm(20260): GC_CONCURRENT freed 213K, 16% free 4276K/5064K, paused 2ms+3ms, total 24ms
03-18 14:23:05.790: I/System.out(20260): server connecting
03-18 14:23:05.810: I/System.out(20260): onBind
03-18 14:23:05.830: D/libEGL(20260): loaded /vendor/lib/egl/libEGL_POWERVR_SGX544_115.so
03-18 14:23:05.840: D/libEGL(20260): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX544_115.so
03-18 14:23:05.840: D/libEGL(20260): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX544_115.so
03-18 14:23:05.890: D/OpenGLRenderer(20260): Enabling debug mode 0
03-18 14:23:05.910: I/System.out(20260): server binding
03-18 14:23:05.910: I/System.out(20260): CustomBinder
03-18 14:23:13.710: I/System.out(20260): trying to send to server
03-18 14:23:13.720: D/AndroidRuntime(20260): Shutting down VM
03-18 14:23:13.720: W/dalvikvm(20260): threadid=1: thread exiting with uncaught exception (group=0x41954930)
03-18 14:23:13.720: E/AndroidRuntime(20260): FATAL EXCEPTION: main
03-18 14:23:13.720: E/AndroidRuntime(20260): java.lang.NullPointerException
03-18 14:23:13.720: E/AndroidRuntime(20260):    at com.takenumber.TakeNumber.sendMessageToService(TakeNumber.java:244)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at com.takenumber.TakeNumber$2.onClick(TakeNumber.java:339)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at android.view.View.performClick(View.java:4204)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at android.view.View$PerformClick.run(View.java:17355)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at android.os.Handler.handleCallback(Handler.java:725)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at android.os.Looper.loop(Looper.java:137)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at android.app.ActivityThread.main(ActivityThread.java:5041)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at java.lang.reflect.Method.invokeNative(Native Method)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at java.lang.reflect.Method.invoke(Method.java:511)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at dalvik.system.NativeStart.main(Native Method)

当我试图将数据发送到服务时,调用按钮后应用程序崩溃。

我自己找到了解决方案。我已经在pastebin上发布了我的活动和服务代码

活动:

服务器服务:

出于某种原因,从活动到服务的messenger对象以某种方式将自身设置为null。 通过将其声明为静态,问题得到了解决

我希望任何人都能从中吸取教训。
感谢上面的所有回复。

以下哪一行是
TakeNumber.sendMessageToService(TakeNumber.java:240)
?当然,对不起!我把它添加到问题中,这个问题倾向于表明
boundServiceServer
为空。你确定服务已绑定吗?现在你问了,我不是绝对确定。有没有一个好方法来确定它是否是绑定的?
03-18 14:23:05.740: D/dalvikvm(20260): GC_CONCURRENT freed 213K, 16% free 4276K/5064K, paused 2ms+3ms, total 24ms
03-18 14:23:05.790: I/System.out(20260): server connecting
03-18 14:23:05.810: I/System.out(20260): onBind
03-18 14:23:05.830: D/libEGL(20260): loaded /vendor/lib/egl/libEGL_POWERVR_SGX544_115.so
03-18 14:23:05.840: D/libEGL(20260): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX544_115.so
03-18 14:23:05.840: D/libEGL(20260): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX544_115.so
03-18 14:23:05.890: D/OpenGLRenderer(20260): Enabling debug mode 0
03-18 14:23:05.910: I/System.out(20260): server binding
03-18 14:23:05.910: I/System.out(20260): CustomBinder
03-18 14:23:13.710: I/System.out(20260): trying to send to server
03-18 14:23:13.720: D/AndroidRuntime(20260): Shutting down VM
03-18 14:23:13.720: W/dalvikvm(20260): threadid=1: thread exiting with uncaught exception (group=0x41954930)
03-18 14:23:13.720: E/AndroidRuntime(20260): FATAL EXCEPTION: main
03-18 14:23:13.720: E/AndroidRuntime(20260): java.lang.NullPointerException
03-18 14:23:13.720: E/AndroidRuntime(20260):    at com.takenumber.TakeNumber.sendMessageToService(TakeNumber.java:244)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at com.takenumber.TakeNumber$2.onClick(TakeNumber.java:339)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at android.view.View.performClick(View.java:4204)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at android.view.View$PerformClick.run(View.java:17355)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at android.os.Handler.handleCallback(Handler.java:725)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at android.os.Looper.loop(Looper.java:137)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at android.app.ActivityThread.main(ActivityThread.java:5041)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at java.lang.reflect.Method.invokeNative(Native Method)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at java.lang.reflect.Method.invoke(Method.java:511)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
03-18 14:23:13.720: E/AndroidRuntime(20260):    at dalvik.system.NativeStart.main(Native Method)