Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.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 AIDL ipc消息传递导致nullpointerexception_Android_Service_Ipc_Aidl - Fatal编程技术网

Android AIDL ipc消息传递导致nullpointerexception

Android AIDL ipc消息传递导致nullpointerexception,android,service,ipc,aidl,Android,Service,Ipc,Aidl,我有一个在后台工作的服务,可以时不时地接收消息。 我希望应用程序能够连接到我的服务并接收这些消息。 所以我所做的就是使用AIDL实现IPC。我创建了两个AIDL文件: “IExtMessage”: 和“ICallBackMessage”: 并创建了一个应用程序,用于接收这些消息以测试IPC: public class MainActivity extends Activity implements ServiceConnection{ private IExtMessage bindin

我有一个在后台工作的服务,可以时不时地接收消息。 我希望应用程序能够连接到我的服务并接收这些消息。 所以我所做的就是使用AIDL实现IPC。我创建了两个AIDL文件: “IExtMessage”:

和“ICallBackMessage”:

并创建了一个应用程序,用于接收这些消息以测试IPC:

public class MainActivity extends Activity implements ServiceConnection{
    private IExtMessage binding=null;
    private parseParametersTask task=null;
    HashMap<Integer,List<String>> parameters;
    ParameterAlert alert;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        connectToService();
        task=new parseParametersTask();
        task.execute();
        parameters=ReadParams.params;





    }

    public void connectToService(){
        Intent implicit=new Intent(IExtMessage.class.getName());
        List<ResolveInfo> matches=getPackageManager().queryIntentServices(implicit, 0);
        if(matches.size()==0){
            Toast.makeText(getApplicationContext(), "Cannot find a matching service!", Toast.LENGTH_LONG).show();
        }
        else if (matches.size()>1){
            Toast.makeText(getApplicationContext(), "Found multiple matching services!", Toast.LENGTH_LONG).show();
        }
        else{
            Toast.makeText(getApplicationContext(), "Found the Protocol Service", Toast.LENGTH_LONG).show();
            Intent explicit=new Intent(implicit);
            ServiceInfo svcInfo=matches.get(0).serviceInfo;
            ComponentName cn=new ComponentName(svcInfo.applicationInfo.packageName, svcInfo.name);
            explicit.setComponent(cn);
            bindService(explicit, this, Context.BIND_AUTO_CREATE);



        }
    }

    public void buttonClick(View v) {
        if (v.getId() == R.id.navigation) {
            DialogFragment dialog = new navigationChooserFragment();
            dialog.show(getFragmentManager(), "navigation");
        }
        if(v.getId()==R.id.ptt){
            PackageManager pm=getPackageManager();
            Intent i=pm.getLaunchIntentForPackage("com.loudtalks");
            i.addCategory(Intent.CATEGORY_LAUNCHER);
            startActivity(i);
        }

    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.d("SERVICE", "Service Connected");
        binding=IExtMessage.Stub.asInterface(service);
        try {
            binding.getMessage(cb);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.d("SERVICE","Service disconnected :(");
        binding=null;

    }

    ICallBackMessage.Stub cb=new ICallBackMessage.Stub() {

        @Override
        public void onMessageReceived(int parameter,int state) throws RemoteException {
            Log.d("SERVICE","received parameter "+parameter);
            Log.d("SERVICE", "received state " + state);
            FragmentManager fm=getFragmentManager();
            FragmentTransaction ft=fm.beginTransaction();
            if(state==1){
                alert=new ParameterAlert();
                Bundle bundleParam=new Bundle();
                bundleParam.putInt("parameter",parameter);
                alert.setArguments(bundleParam);
                alert.show(ft,"alert");
            }else {
                if (alert.isVisible()) {
                    alert.dismiss();
                }
            }
        }
    };

    class parseParametersTask extends AsyncTask<Void,Void,Void>{

        @Override
        protected Void doInBackground(Void... params) {
            ReadParams readParams =new ReadParams();
            try {
                readParams.setInputFile(getAssets().open("parameters.xls"));
                readParams.read();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }
    }

}
cb1是一个静态ICallBackMessage变量,我在收到消息时保存该变量。 在我的服务中,这是传递消息的侦听器:

        try {
            cb1.onMessageReceived(carParameter, state);
        } catch (RemoteException e1) {
            // TODO Auto-generated catch block
            L.m("TESTSERVICE", "" + e1);
        }
所以,问题是,有时一切都很好,但有时我的服务崩溃了,只有一个例外:

05-11 13:55:28.763: E/AndroidRuntime(1924): FATAL EXCEPTION: main
05-11 13:55:28.763: E/AndroidRuntime(1924): java.lang.NullPointerException
05-11 13:55:28.763: E/AndroidRuntime(1924):     at android.os.Parcel.readException(Parcel.java:1333)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at android.os.Parcel.readException(Parcel.java:1281)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at com.tfl.extprotocolservice.ICallBackMessage$Stub$Proxy.onMessageReceived(ICallBackMessage.java:83)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at com.tfl.extprotocolservice.ExtProtocolService$1.handleMessage(ExtProtocolService.java:127)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at android.os.Looper.loop(Looper.java:137)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at android.app.ActivityThread.main(ActivityThread.java:4424)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at java.lang.reflect.Method.invokeNative(Native Method)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at java.lang.reflect.Method.invoke(Method.java:511)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at dalvik.system.NativeStart.main(Native Method)
我不知道为什么会这样,也许我在什么地方漏了点什么。
我到处找了,但找不到答案

您的源代码看起来不错。我真的不知道出了什么问题。您可以尝试使用oneway&out关键字。我写了一个简单的演示,如果你想看一下。

你用cb1做什么?@pskink我把它保存到一个静态变量中。当收到一条消息时,我有一个侦听器在该变量上。我编辑了我的问题,并添加了一些代码来解释我的问题。来自远程服务的回调。一个回调有效(它有一个自定义对象),另一个抛出异常(它也有一个自定义对象)。堆栈跟踪无法跟踪,错误在同一个位置(相同的两个parcelReadExceptions()),我不知道如何调试它。这应该是一个注释。我明白了,但我没有足够的声誉来评论。好吧,如果你能从演示中获取一些代码并将其放入可运行的答案中,那会更好。在这里,只提供链接的答案往往不受欢迎。
public IBinder onBind(Intent intent) {

        return (new ExtMessageBinder());


}


    private static class ExtMessageBinder extends IExtMessage.Stub {
    @Override
    public void getMessage(ICallBackMessage cb) throws RemoteException {
        L.m("TESTSERVICE","getMessage in Service called");

        cb1 = cb;

    }

}
        try {
            cb1.onMessageReceived(carParameter, state);
        } catch (RemoteException e1) {
            // TODO Auto-generated catch block
            L.m("TESTSERVICE", "" + e1);
        }
05-11 13:55:28.763: E/AndroidRuntime(1924): FATAL EXCEPTION: main
05-11 13:55:28.763: E/AndroidRuntime(1924): java.lang.NullPointerException
05-11 13:55:28.763: E/AndroidRuntime(1924):     at android.os.Parcel.readException(Parcel.java:1333)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at android.os.Parcel.readException(Parcel.java:1281)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at com.tfl.extprotocolservice.ICallBackMessage$Stub$Proxy.onMessageReceived(ICallBackMessage.java:83)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at com.tfl.extprotocolservice.ExtProtocolService$1.handleMessage(ExtProtocolService.java:127)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at android.os.Looper.loop(Looper.java:137)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at android.app.ActivityThread.main(ActivityThread.java:4424)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at java.lang.reflect.Method.invokeNative(Native Method)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at java.lang.reflect.Method.invoke(Method.java:511)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-11 13:55:28.763: E/AndroidRuntime(1924):     at dalvik.system.NativeStart.main(Native Method)