1

After trying several options, I'm not able to receive all the SignalR messages on my Android application. In my opinion it seems to be something related with the LongPollingTransport, but I can't find the solution... I receive all the longPolling messages, but sometimes it enters the handler and other times it tries to connect again to the server without entering the handler method.

I've tried to follow the examples on here.

The code is very simple:

public void startNewSignalR(){

    Platform.loadPlatformComponent(new AndroidPlatformComponent());

    // Create a new console logger
    Logger logger = new Logger() {
        @Override
        public void log(String message, LogLevel level) {
            System.out.println(message);
        }
    };

    Uri signalRSource = Uri.parse(serverUrl);
    HubConnection connection = new HubConnection(signalRSource.toString(), "", true, logger);
    eventHub = connection.createHubProxy("eventHub");

    connection.error(new ErrorCallback() {

        @Override
        public void onError(Throwable error) {
            System.err.println("There was an error communicating with the server.");
            System.err.println("Error detail: " + error.toString());

            error.printStackTrace(System.err);
        }
    });

    // Subscribe to the connected event
    connection.connected(new Runnable() {

        @Override
        public void run() {
            System.out.println("CONNECTED");
        }
    });

    // Subscribe to the closed event
    connection.closed(new Runnable() {

        @Override
        public void run() {
            System.out.println("DISCONNECTED");
        }
    });

    eventHub.subscribe(new Object() {
        @SuppressWarnings("unused")
        public void receivePendingCountUpdate(String A) {
            System.out.println("------------------------>>>>> Count: " + A);
        }
    });

    // Start the connection
    connection.start(new LongPollingTransport(logger))
            .done(new Action<Void>() {

                @Override
                public void run(Void obj) throws Exception {
                    System.out.println("Done Connecting!");
                    eventHub.invoke("JoinGroup", "signalevents-" + userId + "-pendingcount");
                }
            });
}

And here you can also see the console output that I receive, where the first message doesn't enter the method and the second one that enters:

02-18 16:23:08.954    6877-9048/com.sensingcontrol.android I/System.out﹕ HubConnection - Starting transport for Reconnection
02-18 16:23:10.307    6877-9031/com.sensingcontrol.android I/System.out﹕ longPolling - Trigger onData with data: {"C":"s-0,10BC5E0|1,264DB67|2,445369|3,106F98E|4,1EAF347","M":[{"H":"EventHub","M":"receivePendingCountUpdate","A":[208]}]}
02-18 16:23:10.307    6877-9031/com.sensingcontrol.android I/System.out﹕ HubConnection - Received data:
02-18 16:23:10.307    6877-9031/com.sensingcontrol.android I/System.out﹕ MessageId received: s-0,10BC5E0|1,264DB67|2,445369|3,106F98E|4,1EAF347
02-18 16:23:10.307    6877-9031/com.sensingcontrol.android I/System.out﹕ Invoking OnReceived with: null
02-18 16:23:10.307    6877-9031/com.sensingcontrol.android I/System.out﹕ HubConnection - Processing message
02-18 16:23:10.313    6877-9048/com.sensingcontrol.android I/System.out﹕ longPolling - Start the communication with the server
02-18 16:23:10.317    6877-9048/com.sensingcontrol.android I/System.out﹕ HubConnection - Getting connection data: [{"name":"eventhub"}]
02-18 16:23:10.317    6877-9048/com.sensingcontrol.android I/System.out﹕ longPolling - Execute the request
02-18 16:23:10.318    6877-9048/com.sensingcontrol.android I/System.out﹕ Create new thread for HTTP Connection
02-18 16:23:10.337    6877-9061/com.sensingcontrol.android I/System.out﹕ Execute the HTTP Request
02-18 16:23:10.337    6877-9061/com.sensingcontrol.android I/System.out﹕ URL: http://url/signalr/reconnect
02-18 16:23:10.342    6877-9061/com.sensingcontrol.android I/System.out﹕ VERB: GET
02-18 16:23:10.342    6877-9061/com.sensingcontrol.android I/System.out﹕ Header User-Agent: SignalR (lang=Java; os=android; version=2.0)
02-18 16:23:10.342    6877-9061/com.sensingcontrol.android I/System.out﹕ CONTENT: null
02-18 16:23:10.343    6877-9061/com.sensingcontrol.android I/System.out﹕ Request executed
02-18 16:23:10.498    6877-9061/com.sensingcontrol.android I/System.out﹕ HubConnection - Entered startLock after transport was started
02-18 16:23:10.498    6877-9061/com.sensingcontrol.android I/System.out﹕ HubConnection - Current state: Reconnecting
02-18 16:23:10.498    6877-9061/com.sensingcontrol.android I/System.out﹕ HubConnection - Starting Heartbeat monitor
02-18 16:23:10.498    6877-9061/com.sensingcontrol.android I/System.out﹕ HubConnection - Reconnected
02-18 16:23:10.498    6877-9061/com.sensingcontrol.android I/System.out﹕ longPolling - Response received
02-18 16:23:10.498    6877-9061/com.sensingcontrol.android I/System.out﹕ longPolling - Read response to the end
02-18 16:23:10.918    6877-9032/com.sensingcontrol.android I/System.out﹕ longPolling - Trigger onData with data: {"C":"s-0,10BC5E1|1,264DB67|2,44536B|3,106F98F|4,1EAF347","M":[{"H":"EventHub","M":"receivePendingCountUpdate","A":[208]}]}
02-18 16:23:10.918    6877-9032/com.sensingcontrol.android I/System.out﹕ HubConnection - Received data:
02-18 16:23:10.938    6877-9030/com.sensingcontrol.android I/System.out﹕ MessageId received: s-0,10BC5E1|1,264DB67|2,44536B|3,106F98F|4,1EAF347
02-18 16:23:10.938    6877-9030/com.sensingcontrol.android I/System.out﹕ Invoking OnReceived with: null
02-18 16:23:10.938    6877-9030/com.sensingcontrol.android I/System.out﹕ HubConnection - Processing message
02-18 16:23:10.940    6877-9047/com.sensingcontrol.android I/System.out﹕ longPolling - Start the communication with the server
02-18 16:23:10.955    6877-9047/com.sensingcontrol.android I/System.out﹕ HubConnection - Getting connection data: [{"name":"eventhub"}]
02-18 16:23:10.955    6877-9047/com.sensingcontrol.android I/System.out﹕ longPolling - Execute the request
02-18 16:23:10.979    6877-9046/com.sensingcontrol.android I/System.out﹕ Create new thread for HTTP Connection
02-18 16:23:10.989    6877-9074/com.sensingcontrol.android I/System.out﹕ Execute the HTTP Request
02-18 16:23:10.989    6877-9074/com.sensingcontrol.android I/System.out﹕ URL: http://url/signalr/reconnect
02-18 16:23:10.989    6877-9074/com.sensingcontrol.android I/System.out﹕ VERB: GET
02-18 16:23:10.997    6877-9073/com.sensingcontrol.android I/System.out﹕ Header User-Agent: SignalR (lang=Java; os=android; version=2.0)
02-18 16:23:10.997    6877-9073/com.sensingcontrol.android I/System.out﹕ CONTENT: null
02-18 16:23:10.998    6877-9073/com.sensingcontrol.android I/System.out﹕ Request executed
02-18 16:23:11.217    6877-9074/com.sensingcontrol.android I/System.out﹕ HubConnection - Entered startLock after transport was started
02-18 16:23:11.217    6877-9074/com.sensingcontrol.android I/System.out﹕ HubConnection - Current state: Reconnecting
02-18 16:23:11.218    6877-9074/com.sensingcontrol.android I/System.out﹕ HubConnection - Starting Heartbeat monitor
02-18 16:23:11.219    6877-9074/com.sensingcontrol.android I/System.out﹕ HubConnection - Reconnected
02-18 16:23:11.239    6877-9073/com.sensingcontrol.android I/System.out﹕ longPolling - Response received
02-18 16:23:11.239    6877-9073/com.sensingcontrol.android I/System.out﹕ longPolling - Read response to the end
02-18 16:23:12.721    6877-9067/com.sensingcontrol.android I/System.out﹕ HubConnection - Timeout
02-18 16:23:12.721    6877-9067/com.sensingcontrol.android I/System.out﹕ HubConnection - Stopping Heartbeat monitor
02-18 16:23:12.722    6877-9067/com.sensingcontrol.android I/System.out﹕ HubConnection - Restarting the transport
02-18 16:23:12.722    6877-9067/com.sensingcontrol.android I/System.out﹕ HubConnection - Entered startLock in startTransport
02-18 16:23:12.722    6877-9067/com.sensingcontrol.android I/System.out﹕ HubConnection - Starting the transport
02-18 16:23:12.722    6877-9067/com.sensingcontrol.android I/System.out﹕ HubConnection - Stopping heartbeat monitor
02-18 16:23:12.722    6877-9067/com.sensingcontrol.android I/System.out﹕ HubConnection - Clearing invocation callbacks: Reconnecting
02-18 16:23:12.723    6877-9067/com.sensingcontrol.android I/System.out﹕ HubConnection - Starting transport for Reconnection
02-18 16:23:14.073    6877-9061/com.sensingcontrol.android I/System.out﹕ longPolling - Trigger onData with data: {"C":"s-0,10BC5E7|1,264DB6C|2,445378|3,106F995|4,1EAF34C","M":[{"H":"EventHub","M":"receivePendingCountUpdate","A":[209]}]}
02-18 16:23:14.073    6877-9061/com.sensingcontrol.android I/System.out﹕ HubConnection - Received data:
02-18 16:23:14.074    6877-9061/com.sensingcontrol.android I/System.out﹕ MessageId received: s-0,10BC5E7|1,264DB6C|2,445378|3,106F995|4,1EAF34C
02-18 16:23:14.074    6877-9061/com.sensingcontrol.android I/System.out﹕ Invoking OnReceived with: null
02-18 16:23:14.123    6877-9073/com.sensingcontrol.android I/System.out﹕ HubConnection - Processing message
02-18 16:23:14.123    6877-9067/com.sensingcontrol.android I/System.out﹕ longPolling - Start the communication with the server
02-18 16:23:14.124    6877-9067/com.sensingcontrol.android I/System.out﹕ HubConnection - Getting connection data: [{"name":"eventhub"}]
02-18 16:23:14.124    6877-9067/com.sensingcontrol.android I/System.out﹕ longPolling - Execute the request
02-18 16:23:14.124    6877-9067/com.sensingcontrol.android I/System.out﹕ Create new thread for HTTP Connection
02-18 16:23:14.141    6877-9078/com.sensingcontrol.android I/System.out﹕ Execute the HTTP Request
02-18 16:23:14.141    6877-9078/com.sensingcontrol.android I/System.out﹕ URL: http://url/signalr/reconnect
02-18 16:23:14.141    6877-9078/com.sensingcontrol.android I/System.out﹕ VERB: GET
02-18 16:23:14.149    6877-9077/com.sensingcontrol.android I/System.out﹕ Header User-Agent: SignalR (lang=Java; os=android; version=2.0)
02-18 16:23:14.149    6877-9077/com.sensingcontrol.android I/System.out﹕ CONTENT: null
02-18 16:23:14.149    6877-9077/com.sensingcontrol.android I/System.out﹕ Request executed
02-18 16:23:14.267    6877-9079/com.sensingcontrol.android I/System.out﹕ HubConnection - Entered startLock after transport was started
02-18 16:23:14.267    6877-9079/com.sensingcontrol.android I/System.out﹕ HubConnection - Current state: Reconnecting
02-18 16:23:14.267    6877-9079/com.sensingcontrol.android I/System.out﹕ HubConnection - Starting Heartbeat monitor
02-18 16:23:14.268    6877-9079/com.sensingcontrol.android I/System.out﹕ HubConnection - Reconnected
02-18 16:23:14.271    6877-9077/com.sensingcontrol.android I/System.out﹕ longPolling - Response received
02-18 16:23:14.271    6877-9077/com.sensingcontrol.android I/System.out﹕ longPolling - Read response to the end
02-18 16:23:16.117    6877-9077/com.sensingcontrol.android I/System.out﹕ longPolling - Trigger onData with data: {"C":"s-0,10BC5F2|1,264DB6E|2,44537C|3,106F997|4,1EAF34E","M":[{"H":"EventHub","M":"receivePendingCountUpdate","A":[209]}]}
02-18 16:23:16.117    6877-9077/com.sensingcontrol.android I/System.out﹕ HubConnection - Received data:
02-18 16:23:16.118    6877-9077/com.sensingcontrol.android I/System.out﹕ MessageId received: s-0,10BC5F2|1,264DB6E|2,44537C|3,106F997|4,1EAF34E
02-18 16:23:16.136    6877-9077/com.sensingcontrol.android I/System.out﹕ Invoking OnReceived with: null
02-18 16:23:16.137    6877-9077/com.sensingcontrol.android I/System.out﹕ HubConnection - Processing message
02-18 16:23:16.137    6877-9077/com.sensingcontrol.android I/System.out﹕ HubConnection - Getting HubInvocation from message
02-18 16:23:16.138    6877-9077/com.sensingcontrol.android I/System.out﹕ HubConnection - Message for: eventhub
02-18 16:23:16.138    6877-9077/com.sensingcontrol.android I/System.out﹕ HubConnection - Invoking event: receivependingcountupdate with arguments [209]
02-18 16:23:16.138    6877-9077/com.sensingcontrol.android I/System.out﹕ HubProxy eventHub - Handling dynamic subscription: receivePendingCountUpdate
02-18 16:23:16.139    6877-9077/com.sensingcontrol.android I/System.out﹕ HubProxy eventHub - Invoking method for dynamic subscription: receivePendingCountUpdate
02-18 16:23:16.173    6877-9079/com.sensingcontrol.android I/System.out﹕ ------------------------>>>>> Count: 209
02-18 16:23:16.173    6877-9079/com.sensingcontrol.android I/System.out﹕ longPolling - Continue polling
raul.broto
  • 66
  • 1
  • 8

1 Answers1

6

Im an expert in SignalR android client and I will show you the best way to do this:

Step 1: configure your hub connection like this

private HubConnection _connection;
private HubProxy _hub;

String host = "http://www.thisisawebsite.net"; //The url from your web site
            _connection = new HubConnection( host );
            _hub = _connection.createHubProxy( "NameHub" ); //The name from your hub class in your server

Step 2:

do the connection with a private method or like you want:

 private  SignalRFuture<Void> _awaitConnection;

     private void startConnection(){
             _awaitConnection = _connection.start(new LongPollingTransport(_connection.getLogger()));
//you can do here a while loop for reintents or something ( this is a good practices, at least 3 tries.
                try {         
                    _awaitConnection.get(2000,TimeUnit.MILLISECONDS);  
                    escucharGrupos();
                    isConnected = true;   
                    break;
                } catch (InterruptedException e) {
                         System.out.println("Disconnect . . .");
                } catch (ExecutionException e) {
                         System.out.println("Error . . .");
                }catch(Exception e){}
        } 

if all here is correct, you could print something like System.out.println("Connection done"); and this means that your persistence connection between your client and your server is already done and fine.

Step 3: Configure handlers:

I usually do this with a method:

private SubscriptionHandler1 handlerCon;
private void starHandlersConnection(){
 handlerCon = new SubscriptionHandler1<String>() {
            @Override
            public void run(String p1) {
              //Here is where we get back the response from the server. Do stuffs
            }
        };

 _hub.on("NameOfFunctionOfYourHub",handlerCon,String.class);
}

Follow all these steps and this should work fine.

Also as a tip, make your connections hub in a Service class. You can do chats like whatsapp or telegram with this way.

AbelMorgan
  • 411
  • 1
  • 5
  • 16
  • can you help here please: http://stackoverflow.com/questions/33895278/expandable-listview-does-not-refresh-childs-items – Carlos G. Nov 25 '15 at 02:19
  • I am using signal r in my application. But it skips few messages randomly. what may be the issue. – Kurkula May 04 '16 at 05:40
  • @AbelMorgan mHubProxy.on(CLIENT_METHOD_BROADAST_MESSAGE, new SubscriptionHandler3() this is work fine and called when response from server but I have make reconnect the signlr connection when internet is lost but mHubProxy.invoke method is call and method sent to server but response not come and not call the mHubProxy.on method. Please help me to solve the issue – Dipanki Jadav Oct 26 '16 at 12:09
  • When you do a reconnect action you must to instantiate the hubConnection and hub proxy object again because your "old" object is not valid anymore, basically you must to repeat the first step process. And remember to subscribe again your listeners – AbelMorgan Oct 26 '16 at 14:37
  • @AbelMorgan please see the screen shot http://prnt.sc/czgcoc I have already Instatiate the hubConnection and also subscribe listener – Dipanki Jadav Oct 27 '16 at 03:36
  • Download this .java class: https://drive.google.com/file/d/0B6m12lEv0Q_QY3h0Z1U3WXFpRmc/view?usp=sharing Here is my example code, maybe is a bit chaotic, but it can help you more than enough – AbelMorgan Oct 28 '16 at 12:59