summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Grover <joeygrover@gmail.com>2016-05-04 14:20:23 -0400
committerJoey Grover <joeygrover@gmail.com>2016-05-04 14:20:23 -0400
commit810b1cedc7c2c4bb65f72f9b734316316ceb5f0b (patch)
tree2347a72e0530b4353b609272f9e42110cdd6e652
parentd5ce6e9e7787e5ede46250710b02bcf5c7d5f382 (diff)
downloadsdl_android-810b1cedc7c2c4bb65f72f9b734316316ceb5f0b.tar.gz
Implemented retry strategy for false-positve deadobjectexceptions in transport broker.
If binder is still alive and transport broker can ping it, the broker will attempt to resend the message through the binder with max retry of 5.
-rw-r--r--sdl_android_lib/src/com/smartdevicelink/transport/TransportBroker.java50
1 files changed, 27 insertions, 23 deletions
diff --git a/sdl_android_lib/src/com/smartdevicelink/transport/TransportBroker.java b/sdl_android_lib/src/com/smartdevicelink/transport/TransportBroker.java
index f0fdfcc89..0a1d25364 100644
--- a/sdl_android_lib/src/com/smartdevicelink/transport/TransportBroker.java
+++ b/sdl_android_lib/src/com/smartdevicelink/transport/TransportBroker.java
@@ -77,6 +77,10 @@ public class TransportBroker {
}
protected synchronized boolean sendMessageToRouterService(Message message){
+ return sendMessageToRouterService(message,0);
+ }
+
+ protected synchronized boolean sendMessageToRouterService(Message message, int retryCount){
if(message == null){
Log.w(TAG, "Attempted to send null message");
return false;
@@ -86,29 +90,29 @@ public class TransportBroker {
if(registeredWithRouterService
|| message.what == TransportConstants.ROUTER_REGISTER_CLIENT){ //We can send a message if we are registered or are attempting to register
try {
- routerServiceMessenger.send(message);
- return true;
- } catch (RemoteException e) {
- e.printStackTrace();
- if(e instanceof TransactionTooLargeException){
- e.printStackTrace();
- try {
- Thread.sleep(100);
- } catch (InterruptedException e1) {
- e1.printStackTrace();
- }
- return sendMessageToRouterService(message);
- }else{
- //DeadObject, time to kill our connection
- Log.d(TAG, "Dead object while attempting to send packet");
- routerServiceMessenger = null;
- registeredWithRouterService = false;
- isBound = false;
- onHardwareDisconnected(null);
- return false;
- }
-
- }
+ routerServiceMessenger.send(message);
+ return true;
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ //Let's check to see if we should retry
+ if(e instanceof TransactionTooLargeException
+ || (retryCount<5 && routerServiceMessenger.getBinder().isBinderAlive() && routerServiceMessenger.getBinder().pingBinder())){ //We probably just failed on a small transaction =\
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e1) {
+ e1.printStackTrace();
+ }
+ return sendMessageToRouterService(message, retryCount++);
+ }else{
+ //DeadObject, time to kill our connection
+ Log.d(TAG, "Dead object while attempting to send packet");
+ routerServiceMessenger = null;
+ registeredWithRouterService = false;
+ isBound = false;
+ onHardwareDisconnected(null);
+ return false;
+ }
+ }
}else{
Log.e(TAG, "Unable to send message to router service. Not registered.");
return false;