diff --git a/graphenej/src/main/java/cy/agorise/graphenej/api/android/NetworkService.java b/graphenej/src/main/java/cy/agorise/graphenej/api/android/NetworkService.java index e2f6c9d..d185b5c 100644 --- a/graphenej/src/main/java/cy/agorise/graphenej/api/android/NetworkService.java +++ b/graphenej/src/main/java/cy/agorise/graphenej/api/android/NetworkService.java @@ -2,6 +2,7 @@ package cy.agorise.graphenej.api.android; import android.app.Service; import android.content.Intent; +import java.util.concurrent.TimeUnit; import android.os.Binder; import android.os.Bundle; import android.os.Handler; @@ -210,7 +211,10 @@ public class NetworkService extends Service { * Actually establishes a connection from this Service to one of the full nodes. */ public void connect(){ - OkHttpClient client = new OkHttpClient(); + OkHttpClient client = new OkHttpClient + .Builder() + .connectTimeout(2, TimeUnit.SECONDS) + .build(); mSelectedNode = nodeProvider.getBestNode(); Log.v(TAG,"connect.url: "+ mSelectedNode.getUrl()); Request request = new Request.Builder().url(mSelectedNode.getUrl()).build(); diff --git a/graphenej/src/main/java/cy/agorise/graphenej/network/NodeLatencyVerifier.java b/graphenej/src/main/java/cy/agorise/graphenej/network/NodeLatencyVerifier.java index 18c63dc..0b97301 100644 --- a/graphenej/src/main/java/cy/agorise/graphenej/network/NodeLatencyVerifier.java +++ b/graphenej/src/main/java/cy/agorise/graphenej/network/NodeLatencyVerifier.java @@ -102,11 +102,10 @@ public class NodeLatencyVerifier { } String normalURL = fullNode.getUrl().replace("wss://", "https://"); - if(!nodeURLMap.containsKey(fullNode.getUrl().replace("wss://", "https://"))){ - HttpUrl key = HttpUrl.parse(normalURL); + HttpUrl key = HttpUrl.parse(normalURL); + if(!nodeURLMap.containsKey(key)){ nodeURLMap.put(key, fullNode); } - client.newWebSocket(request, mWebSocketListener); } mHandler.postDelayed(this, verificationPeriod); @@ -133,37 +132,43 @@ public class NodeLatencyVerifier { * Method used to handle the node's first response. The idea here is to obtain * the RTT (Round Trip Time) measurement and publish it using the PublishSubject. * - * @param webSocket Websocket instance + * @param webSocket WebSocket instance * @param response Response instance */ private void handleResponse(WebSocket webSocket, Response response){ - // Obtaining the HttpUrl instance that was previously used as a key - HttpUrl url = webSocket.request().url(); - if(nodeURLMap.containsKey(url)){ - FullNode fullNode = nodeURLMap.get(url); - long delay; + synchronized (this){ + // Obtaining the HttpUrl instance that was previously used as a key + HttpUrl url = webSocket.request().url(); + if(nodeURLMap.containsKey(url)){ + FullNode fullNode = nodeURLMap.get(url); + long delay; - if(response == null) { - // There is no internet connection, or the node is unreachable. We are just - // putting an artificial delay. - delay = Long.MAX_VALUE; - } else { - long after = System.currentTimeMillis(); - long before = timestamps.get(fullNode); - delay = after - before; - } - fullNode.addLatencyValue(delay); - subject.onNext(fullNode); - }else{ - // We cannot properly handle a response to a request whose - // URL was not registered at the nodeURLMap. This is because without this, - // we cannot know to which node this response corresponds. This should not happen. - Log.e(TAG,"nodeURLMap does not contain url: "+url); - for(HttpUrl key : nodeURLMap.keySet()){ - Log.e(TAG,"> "+key); + if(response == null) { + // There is no internet connection, or the node is unreachable. We are just + // putting an artificial delay. + delay = Long.MAX_VALUE; + } else { + long after = System.currentTimeMillis(); + long before = timestamps.get(fullNode); + delay = after - before; + } + if(fullNode != null){ + fullNode.addLatencyValue(delay); + subject.onNext(fullNode); + }else{ + Log.w(TAG,"Could not extract FullNode instance from the map"); + } + }else{ + // We cannot properly handle a response to a request whose + // URL was not registered at the nodeURLMap. This is because without this, + // we cannot know to which node this response corresponds. This should not happen. + Log.e(TAG,"nodeURLMap does not contain url: "+url); + for(HttpUrl key : nodeURLMap.keySet()){ + Log.e(TAG,"> "+key); + } } + webSocket.close(NetworkService.NORMAL_CLOSURE_STATUS, null); } - webSocket.close(NetworkService.NORMAL_CLOSURE_STATUS, null); } };