qq_little权权
2016-04-11 16:32
04-11 02:39:02.488 2986-2986/com.example.wwq.aidlclient E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.wwq.aidlclient, PID: 2986
java.lang.NullPointerException: Attempt to invoke interface method 'int com.example.wwq.myapplication.IMyAidl.add(int, int)' on a null object reference
at com.example.wwq.aidlclient.MainActivity.onClick(MainActivity.java:66)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
//调用远程的服务
int res= iMyAidl.add(num2, num1);
mEtRes.setText(res);
出错在 mEtRes.setText(res);这里。mEtRes.setText(res);中的res是一个int 类型,那么res值对应是values文件夹中的strings.xml里的值。
应该改为mEtRes.setText(res+“”);这样就行了
我也遇到这个问题。我解决了。
大家想一下,我们除了app module 之外,又建立了一个aidlclient module。那么我们运行的时候,应该安装并启动哪一个呢?现在一想,既然出现了编辑框和按钮界面,那不是我们在aidlclient module编辑的页面吗?对呀。我们只安装启动了aidlclient module。也就是只要客户端。
那么服务端跑哪里呢?想一下,是不是我们没有安装呢?对滴。
那么怎么确定自己安装是那个module呢?看下图:
把app那个module先运行到手机上一次就可以了,手机上根本就没有你要远程调用的那个进程怎么调用。
在服务端 注册<service android:name=".AIDL"
android:enabled="true"
android:exported="true"></service>
解决了没有啊 啊啊啊,我也刚遇到这个问题
解决了没有啊 啊啊啊,我也刚遇到这个问题
service 与activity一样必须在AndroidManifest.xml里面注册,因为你没有注册,肯定出错了
这是啥意思啊 a
package com.example.wwq.AidlClient;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.example.wwq.myapplication.IMyAidl;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText mEtNum1;
private EditText mEtNum2;
private EditText mEtRes;
private Button mBtnAdd;
IMyAidl iMyAidl;
private ServiceConnection conn = new ServiceConnection() {
//绑定上服务的时候
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//拿到了远程的服务
iMyAidl = IMyAidl.Stub.asInterface(service);
}
//断开服务的时候
@Override
public void onServiceDisconnected(ComponentName name) {
//回收资源
iMyAidl = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//软件一启动就绑定服务
bindService();
}
private void initView() {
mEtNum1 = (EditText) findViewById(R.id.et_num1);
mEtNum2 = (EditText) findViewById(R.id.et_num2);
mEtRes = (EditText) findViewById(R.id.et_res);
mBtnAdd = (Button) findViewById(R.id.btn_add);
mBtnAdd.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int num1 = Integer.parseInt(mEtNum1.getText().toString());
int num2 = Integer.parseInt(mEtNum2.getText().toString());
try {
//调用远程的服务
int res= iMyAidl.add(num2, num1);
mEtRes.setText(res);
} catch (RemoteException e) {
e.printStackTrace();
mEtRes.setText("错误了");
}
}
private void bindService() {
//获取到服务端
Intent intent = new Intent();
//新版本,必须 显示intent启动 绑定服务
intent.setComponent(new ComponentName
("com.example.wwq.myapplication","com.example.wwq.myapplication.IRemoteService"));
bindService(intent,conn, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}
服务端那个类的名字
包名+类名 用.把前面的包名省略了
服务端注册Service
<service android:name=".AIDL"
android:enabled="true"
android:exported="true"></service>
试试
if(!edt_num1.getText().toString().equals("") && !edt_num2.getText().toString().equals("")){
int num1 = Integer.parseInt(edt_num1.getText().toString());
int num2 = Integer.parseInt(edt_num2.getText().toString());
try {
int res = sueAidl.add(num1,num2);
edt_res.setText(res+"");
} catch (RemoteException e) {
e.printStackTrace();
}
}else{
Snackbar.make(v, "请输入两个值", Snackbar.LENGTH_LONG).show();
}
NullPointerException异常,add(int, int)应该是空的,没做判断
AIDL-小白成长记
42640 学习 · 60 问题
相似问题