1、在断开连接时 重连
ServiceConnection receverIdcard = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myIdBaeBinder = ReceverAidlInterface.Stub.asInterface(service);
try {
myIdBaeBinder.asBinder().linkToDeath(mDeathRecipient,0);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
myIdBaeBinder = null;
autoBindAIDL();
}
};
2、调用 binder 对象是 nullpoint ,分析应该是 binder 代理对象nullPoint,所以,捕获异常重连。
定义局部变量,为了防止全部变量异步更改。
参考:http://www.gcssloop.com/gebug/nullpointer-exception
try {
final ReceverAidlInterface mtempBinder = myIdBaeBinder;
if (mtempBinder != null) {
mtempBinder.setIdcard(idCardInfo,recData);
}else {
autoBindAIDL();
}
}catch (NullPointerException e) {//增加 nullpoint判断 2018-12-7 09:32:55 因为 上面 if (myIdBaeBinder != null)之后还是 一直 null
// java.lang.NullPointerException: Attempt to invoke interface method 'void com.opzoon.face.standard.service.IIdBaseAidlInterface.setReadIdCard(boolean)' on a null object reference
// at android.os.Parcel.readException(Parcel.java:1546)
// at android.os.Parcel.readException(Parcel.java:1493)
// at com.sdk.cudaalgorithm.ReceverAidlInterface$Stub$Proxy.setRecMsg(ReceverAidlInterface.java:122)
// at com.opzoon.face.standard.service.ByIdBaseService.getInputStream(ByIdBaseService.java:838)
// at com.opzoon.face.standard.service.ByIdBaseService$ThreadRun.run(ByIdBaseService.java:339)
autoBindAIDL();
}
3、重新连接,开启异步与延时,防止并发
private void autoBindAIDL() {
try {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (ByIdBaseService.class){
try {
Thread.sleep(100);//延时防止 循环创建binder 还没有准备好。
} catch (InterruptedException e) {
e.printStackTrace();
}
Intent i = new Intent(ByIdBaseService.this, RecevierIdcardService.class);
bindService(i, receverIdcard, BIND_AUTO_CREATE);
}
}
}).start();
}catch (Exception e){
mLogger.e("autoBindAIDL--Exception "+Log.getStackTraceString(e));
e.printStackTrace();
}
}