How to use signalr in Android

57,176

Solution 1

UPDATE 2018:

If you are using SignalR.net Core use this library otherwise you will get error on connection.

SERVER SIDE:

The following is my sample server-side code, you can pay attention to public void Send(string message) and public void SendChatMessage(string to, string message).

  • Server-side app: public void SendChatMessage(string to, string message)

    • Android client app: mHubProxy.invoke("SendChatMessage", receiverName, message);
  • Server-side app: public void Send(string message)

    • Android client app: mHubProxy.invoke("Send", message);
namespace SignalRDemo
{
    public class ChatHub : Hub
    {
        private static ConcurrentDictionary<string, string> FromUsers = new ConcurrentDictionary<string, string>();         // <connectionId, userName>
        private static ConcurrentDictionary<string, string> ToUsers = new ConcurrentDictionary<string, string>();           // <userName, connectionId>
        private string userName = "";

    public override Task OnConnected()
    {
        DoConnect();
        Clients.AllExcept(Context.ConnectionId).broadcastMessage(new ChatMessage() { UserName = userName, Message = "I'm Online" });
        return base.OnConnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        if (stopCalled) // Client explicitly closed the connection
        {
            string id = Context.ConnectionId;
            FromUsers.TryRemove(id, out userName);
            ToUsers.TryRemove(userName, out id);
            Clients.AllExcept(Context.ConnectionId).broadcastMessage(new ChatMessage() { UserName = userName, Message = "I'm Offline" });
        }
        else // Client timed out
        {
            // Do nothing here...
            // FromUsers.TryGetValue(Context.ConnectionId, out userName);            
            // Clients.AllExcept(Context.ConnectionId).broadcastMessage(new ChatMessage() { UserName = userName, Message = "I'm Offline By TimeOut"});                
        }

        return base.OnDisconnected(stopCalled);
    }

    public override Task OnReconnected()
    {
        DoConnect();
        Clients.AllExcept(Context.ConnectionId).broadcastMessage(new ChatMessage() { UserName = userName, Message = "I'm Online Again" });
        return base.OnReconnected();
    }

    private void DoConnect()
    {
        userName = Context.Request.Headers["User-Name"];
        if (userName == null || userName.Length == 0)
        {
            userName = Context.QueryString["User-Name"]; // for javascript clients
        }
        FromUsers.TryAdd(Context.ConnectionId, userName);
        String oldId; // for case: disconnected from Client
        ToUsers.TryRemove(userName, out oldId);
        ToUsers.TryAdd(userName, Context.ConnectionId);
    }

    public void Send(string message)
    {
        // Call the broadcastMessage method to update clients.            
        string fromUser;
        FromUsers.TryGetValue(Context.ConnectionId, out fromUser);
        Clients.AllExcept(Context.ConnectionId).broadcastMessage(new ChatMessage() { UserName = fromUser, Message = message });
    }

    public void SendChatMessage(string to, string message)
    {
        FromUsers.TryGetValue(Context.ConnectionId, out userName);
        string receiver_ConnectionId;
        ToUsers.TryGetValue(to, out receiver_ConnectionId);

        if (receiver_ConnectionId != null && receiver_ConnectionId.Length > 0)
        {
            Clients.Client(receiver_ConnectionId).broadcastMessage(new ChatMessage() { UserName = userName, Message = message });
        }
    }        
}

public class ChatMessage
{
    public string UserName { get; set; }
    public string Message { get; set; }
}
}

CLIENT SIDE:

If you have not read my answer at the following question:

SignalR integration in android studio

Then, here is my working basic code:

public class SignalRService extends Service {
    private HubConnection mHubConnection;
    private HubProxy mHubProxy;
    private Handler mHandler; // to display Toast message
    private final IBinder mBinder = new LocalBinder(); // Binder given to clients

public SignalRService() {
}

@Override
public void onCreate() {
    super.onCreate();
    mHandler = new Handler(Looper.getMainLooper());
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    int result = super.onStartCommand(intent, flags, startId);
    startSignalR();
    return result;
}

@Override
public void onDestroy() {
    mHubConnection.stop();
    super.onDestroy();
}

@Override
public IBinder onBind(Intent intent) {
    // Return the communication channel to the service.
    startSignalR();
    return mBinder;
}

/**
 * Class used for the client Binder.  Because we know this service always
 * runs in the same process as its clients, we don't need to deal with IPC.
 */
public class LocalBinder extends Binder {
    public SignalRService getService() {
        // Return this instance of SignalRService so clients can call public methods
        return SignalRService.this;
    }
}

/**
 * method for clients (activities)
 */
public void sendMessage(String message) {
    String SERVER_METHOD_SEND = "Send";
    mHubProxy.invoke(SERVER_METHOD_SEND, message);
}    

private void startSignalR() {
    Platform.loadPlatformComponent(new AndroidPlatformComponent());

    Credentials credentials = new Credentials() {
        @Override
        public void prepareRequest(Request request) {
            request.addHeader("User-Name", "BNK");
        }
    };

    String serverUrl = "http://192.168.1.100";
    mHubConnection = new HubConnection(serverUrl);
    mHubConnection.setCredentials(credentials);
    String SERVER_HUB_CHAT = "ChatHub";
    mHubProxy = mHubConnection.createHubProxy(SERVER_HUB_CHAT);
    ClientTransport clientTransport = new ServerSentEventsTransport(mHubConnection.getLogger());
    SignalRFuture<Void> signalRFuture = mHubConnection.start(clientTransport);

    try {
        signalRFuture.get();
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
        return;
    }

    String HELLO_MSG = "Hello from Android!";
    sendMessage(HELLO_MSG);

    String CLIENT_METHOD_BROADAST_MESSAGE = "broadcastMessage";
    mHubProxy.on(CLIENT_METHOD_BROADAST_MESSAGE,
            new SubscriptionHandler1<CustomMessage>() {
                @Override
                public void run(final CustomMessage msg) {
                    final String finalMsg = msg.UserName + " says " + msg.Message;
                    // display Toast message
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), finalMsg, Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }
            , CustomMessage.class);
}
}

Activity:

public class MainActivity extends AppCompatActivity {

private final Context mContext = this;
private SignalRService mService;
private boolean mBound = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent intent = new Intent();
    intent.setClass(mContext, SignalRService.class);
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
    // Unbind from the service
    if (mBound) {
        unbindService(mConnection);
        mBound = false;
    }
    super.onStop();
}    

public void sendMessage(View view) {
    if (mBound) {
        // Call a method from the SignalRService.
        // However, if this call were something that might hang, then this request should
        // occur in a separate thread to avoid slowing down the activity performance.
        EditText editText = (EditText) findViewById(R.id.edit_message);            
        if (editText != null && editText.getText().length() > 0) {                
            String message = editText.getText().toString();
            mService.sendMessage(message);
        }
    }
}

/**
 * Defines callbacks for service binding, passed to bindService()
 */
private final ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,
                                   IBinder service) {
        // We've bound to SignalRService, cast the IBinder and get SignalRService instance
        SignalRService.LocalBinder binder = (SignalRService.LocalBinder) service;
        mService = binder.getService();
        mBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mBound = false;
    }
};
}

CustomMessage Class:

public class CustomMessage {
    public String UserName;
    public String Message;
}

You can also see my sample client project at this GitHub link


UPDATE FOR RESPONSE FROM INVOKE:

I have just added new sample methods:

Server side:

public string iAmAvailable(string username, string password, string message)
{            
     return "BNK Response for testing Android INVOKE";
}

Client side:

mHubProxy.invoke(String.class, "iAmAvailable", "username", "password", "TransMedic").done(new Action<String>() {
            @Override
            public void run(String s) throws Exception {
                Log.w("SimpleSignalR", s);
            }
        }).onError(new ErrorCallback() {
            @Override
            public void onError(Throwable throwable) {
                Log.e("SimpleSignalR", throwable.toString());
            }
        });

And here is the screenshot:

Android SignalR Invoke Response

Solution 2

The SignalR team recently released a Java client for ASP.NET Core SignalR. Here is a link to getting started docs https://docs.microsoft.com/en-us/aspnet/core/signalr/java-client?view=aspnetcore-2.2

Solution 3

This work for me : Full source Android (Client) & Server GitHub

Server Slide If one argument must use this interface SubscriptionHandler1 if two argument must use this interfaceSubscriptionHandler2 ,...

Sample for two argument like :

Server slide :

using Microsoft.AspNet.SignalR;
namespace SignalRChat
{
    public class ChatHub : Hub
    {
        public void Send(string name, string message)
        {
            // Two argument must use this interfaceSubscriptionHandler2 .
            Clients.All.broadcastMessage(name, message);
        }

    }
}

Client slide :

mHubProxy.on(CLIENT_METHOD_BROADAST_MESSAGE,
                new SubscriptionHandler2<String, String>() {
                    @Override
                    public void run(final String name,final String msg) {
                        final String finalMsg =  msg.toString();
                        // display Toast message
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(getApplicationContext(), finalMsg, Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                }
                , String.class,String.class);

For catch all message can use this :

mHubConnection.received(new MessageReceivedHandler() {

            @Override
            public void onMessageReceived(final JsonElement json) {
                Log.e("onMessageReceived ", json.toString());
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(), json.toString(), Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

Solution 4

do this tutorial step by step : https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?tabs=visual-studio-mac&view=aspnetcore-5.0

1.According above tutorial publish your chat server to favorite host

2.add this dependency to your android sample:

 implementation 'com.microsoft.signalr:signalr:3.0.0'
 

3.add these permission to manifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

4.below code is MainActivity.class:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        HubConnection hubConnection = 
 HubConnectionBuilder.create("https://your_chat_server_url/chatHub").build();
        TextView textView = (TextView)findViewById(R.id.tvMain);
        ListView listView = (ListView)findViewById(R.id.lvMessages);
        Button sendButton = (Button)findViewById(R.id.bSend);
        EditText editText = (EditText)findViewById(R.id.etMessageText);

        List<String> messageList = new ArrayList<String>();
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(MainActivity.this,
                android.R.layout.simple_list_item_1, messageList);
        listView.setAdapter(arrayAdapter);


        hubConnection.on("ReceiveMessage", (user, message)-> {

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    arrayAdapter.add( user + " : " + message);
                    arrayAdapter.notifyDataSetChanged();
                }
            });
        }, String.class,String.class);

        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String message = editText.getText().toString();
                String user = "SAEID";
                editText.setText("");
                try {
                    hubConnection.send("SendMessage", user,message);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        new HubConnectionTask().execute(hubConnection);
    }

    static class HubConnectionTask extends AsyncTask<HubConnection, Void, Void>{

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(HubConnection... hubConnections) {
            HubConnection hubConnection = hubConnections[0];
            hubConnection.start().blockingAwait();
            return null;
        }
    }
}

5.below code is activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:orientation="vertical" >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tvMain" />
    <ListView
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_width="fill_parent"
        android:id="@+id/lvMessages"
        android:transcriptMode="alwaysScroll">
    </ListView>
    <EditText
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:id="@+id/etMessageText"
        android:hint="Enter Message" />
    <Button
        android:text="Send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/bSend" />
</LinearLayout>
Share:
57,176
moDev
Author by

moDev

Mobile Application Developer

Updated on September 29, 2021

Comments

  • moDev
    moDev over 2 years

    I am trying to integrate signalR in android app but no luck. I've been looking at various links but none of them provide proper information about implementation.

    I've the following questions.

    • SignalR integration has to be done inside Service/Intent Service?
    • If we want to receive response via same calling method then how to get?

    I've added three libraries i.e signalr android,signalr client and gson but unable to understand how code works, no proper documentation is available to understand the code.

    Some of the questions asked but not much information

    SignalR in Android Studio Unable to implement p2p chat using SignalR in Android

    If anyone experienced in signal for native apps, it would be very helpful for me.

    Update

        public class SignalRService extends Service {
    
    
        private static final String TAG = "Service";
        private HubConnection mHubConnection;
        private HubProxy mHubProxy;
        private Handler mHandler; // to display Toast message
        private final IBinder mBinder = new LocalBinder(); 
    
        private SharedPreferences sp;
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            Utility.showLog(TAG, "Service Created");
    
            sp = getSharedPreferences(Utility.SHARED_PREFS, MODE_PRIVATE);
            mHandler = new Handler(Looper.myLooper());
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
    
            int result = super.onStartCommand(intent, flags, startId);
            startSignalR();
            return result;
        }
    
        @Override
        public IBinder onBind(Intent intent) {
    
            startSignalR();
            return mBinder;
        }
    
        /**
         * Class used for the client Binder.  Because we know this service always
         * runs in the same process as its clients, we don't need to deal with IPC.
         */
        public class LocalBinder extends Binder {
            public SignalRService getService() {
                // Return this instance of SignalRService so clients can call public methods
                return SignalRService.this;
            }
        }
    
        /**
         * method for clients (activities)
         */
        public void sendMessage() {
    
            String SERVER_METHOD_SEND = "iAmAvailable";
            final String string = new String();
    
            mHubProxy.invoke(new String(), SERVER_METHOD_SEND, sp.getString("user_id", null), sp.getString("pass", null), "TransMedic").done(new Action() {
                @Override
                public void run(Object o) throws Exception {
    
                    Utility.showLog(TAG, o.toString());
    
                }
    
    
            }).onError(new ErrorCallback() {
                @Override
                public void onError(Throwable throwable) {
    
                }
            });
        }
    
        private void startSignalR() {
    
            Platform.loadPlatformComponent(new AndroidPlatformComponent());
    
            String serverUrl = "http://transit.alwaysaware.org/signalr";
    
            mHubConnection = new HubConnection(serverUrl);
    
            String SERVER_HUB_CHAT = "ChatHub";
    
            mHubProxy = mHubConnection.createHubProxy(SERVER_HUB_CHAT);
    
            ClientTransport clientTransport = new ServerSentEventsTransport(mHubConnection.getLogger());
    
            SignalRFuture<Void> signalRFuture = mHubConnection.start(clientTransport);
    
    
            try {
    
                signalRFuture.get();
    
            } catch (InterruptedException | ExecutionException e) {
    
                e.printStackTrace();
                return;
    
            }
    
            sendMessage();
        }
    
        @Override
        public void onDestroy() {
    
            mHubConnection.stop();
            super.onDestroy();
    
        }
    }
    
  • moDev
    moDev over 8 years
    How to check if connection is established
  • moDev
    moDev over 8 years
    Basically I've two different calls to signalR. In one call it sends few parameters and receives response and in other call, it receives response from different method like you mentioned for broadcast Message. How we can do for the first call?
  • moDev
    moDev over 8 years
    I am getting error java.util.concurrent.ExecutionException: microsoft.aspnet.signalr.client.transport.NegotiationExcepti‌​on: There was a problem in the negotiation with the server
  • BNK
    BNK over 8 years
    Can you post your code? Both client and server app.
  • moDev
    moDev over 8 years
    I can post client side code. I don't have access to server code.
  • moDev
    moDev over 8 years
    I've just changed hub name and app got hanged with blank screen.
  • moDev
    moDev over 8 years
    How to receive response from same method using invoke?
  • moDev
    moDev over 8 years
  • BNK
    BNK over 8 years
    I am not sure if it can be or not, if have freetime, I will test and inform you the result. IMO, if you start learning SignalR, try simple cases to check if it works, then more complicated ones, moreover, check more with the person who has written the server app :-)
  • moDev
    moDev over 8 years
    I think it is the simplest case. I am just trying to make connection and send request data to server. It just hangs the entire application. I tried by removing request data but it still hangs the application. Something is wrong
  • BNK
    BNK over 8 years
    You can write your own sample SignalR server app to test with your Android client app
  • moDev
    moDev over 8 years
    I am an mobile developer, so can't do it.
  • moDev
    moDev over 8 years
    Basically, I am more concerned for the client side. Other guys are working on server and they have confirmed that server side is working fine with web UI. It looks may be client side has some issues. I am not sure though
  • BNK
    BNK over 8 years
    Sorry I cannot help you solve your issue. IMO, you can create your own apps to test at home if you have time. Goodluck!
  • moDev
    moDev over 8 years
    Android code that you posted works for you?? Why it hangs entire application and displays black background unless app is forced closed?
  • BNK
    BNK over 8 years
    Of course it works with my own ASP.NET server app :-)
  • moDev
    moDev over 8 years
    can you show how to receive response via callback in invoke method?
  • BNK
    BNK over 8 years
    As you have seen, android client receives response inside SubscriptionHandler1
  • BNK
    BNK over 8 years
    Ah, I have reviewed your code more, you should implement SubscriptionHandler1 to receive server response
  • BNK
    BNK over 8 years
    Glad it finally helps you!
  • moDev
    moDev over 8 years
    do you know how to get result in JSON? I tried to get into object and then converted into JSON but got error. is there any direct way to get JSON result without using object class?
  • BNK
    BNK over 8 years
    Do you mean that your server app returned JSON? I think it returned a List instead, for example List<Product>
  • moDev
    moDev over 8 years
    I found the solution for JSON. Thanks for your help.
  • moDev
    moDev over 8 years
    We are using LongPollingTransport but looks like its getting disconnected but it never returns to closed function of hub connection. We need to keep connection alive always
  • moDev
    moDev over 8 years
    can you help on this?
  • BNK
    BNK over 8 years
    Have you tried mConnection.closed(new Runnable() { @Override public void run() { mLogger.log(Log.ERROR, mConnectionId + " Disconnected!"); if (mConnection.getState().toString().equals("Disconnected")) { new reconnectPulling().execute(); } } }); yet?
  • BNK
    BNK over 8 years
    Looks like that closed only called when server terminated the connection, I tried stop and start IIS later, then getting the following logcat 12-04 11:43:52.555 4105-5449/com.example.signalrclient E/SignalRClient: cec7f6e8-0d9b-43f0-abdd-18c1265d6452 connectionSlow! 12-04 11:43:59.256 4105-5707/com.example.signalrclient E/SignalRClient: cec7f6e8-0d9b-43f0-abdd-18c1265d6452 reconnecting! 12-04 11:43:59.296 4105-5710/com.example.signalrclient E/SignalRClient: cec7f6e8-0d9b-43f0-abdd-18c1265d6452 Disconnected!
  • BNK
    BNK over 8 years
    12-04 11:44:45.406 4105-7380/com.example.signalrclient I/SignalRClient: Connecting to server... 12-04 11:44:50.397 4105-7570/com.example.signalrclient I/SignalRClient: Connected 12-04 11:45:00.947 4105-7943/com.example.signalrclient E/SignalRClient: 96330534-3952-4b65-8187-b5a3499a2749 connectionSlow!
  • BNK
    BNK over 8 years
  • moDev
    moDev over 8 years
    I've been using signalR and it disconnects/closes the connected after 2-3 minutes if app is closed but if app is idle and on the same screen then connection is active for longer time. is that signalR issue?
  • BNK
    BNK over 8 years
    Sorry, I am not sure about that
  • moDev
    moDev over 8 years
    Thanks. I found out the solution. I've another bug. App works in debug mode but when its signed and uploaded to store. Connection doesnt work, nothing works. Any idea?
  • moDev
    moDev over 8 years
    If WIFI is connected then start without any parameter else start with long polling transport parameter
  • BNK
    BNK over 8 years
    Sorry, I have not any app in store :).
  • Jay
    Jay about 8 years
    @BNK Awesome answer! I had a very similar issue in SignalR Android. Can you have a look please? stackoverflow.com/questions/35264835/…
  • Dipanki Jadav
    Dipanki Jadav over 7 years
    @BNK I have implemented a chat using your signlr demo and Works fine but I want to implement notification of new message arrive in app. even though app close like whatsapp. Please help me
  • BNK
    BNK over 7 years
    @DipankiJadav sorry I can't help now, however, I think you can search more in SO about the permanent service in Android, for example stackoverflow.com/questions/15758980/…
  • Dipanki Jadav
    Dipanki Jadav over 7 years
    @moDev Please help me to solve the issue of Disconnection which you face earlier and you have solve it I have see the comments of 8Dec2015 . Please let me know the solution Please help me to solve the issue of Signlr Disconnection due to Internet problem or when App is Idle for longer time
  • Dipanki Jadav
    Dipanki Jadav over 7 years
    @BNK Hello Please help me to solve the issue of Signlr disconnection due to internet problem or when App is Idle for longer time
  • BNK
    BNK over 7 years
    @DipankiJadav sorry I am busy with my work now, however, have you tried using LongPollingTransport and have you read about reconnectPulling in my 2 comments above yet (on Dec 04, 2015)? And pls read asp.net/signalr/overview/guide-to-the-api/… to see if it can help or not
  • moDev
    moDev over 7 years
    @DipankiJadav You need to reconnect everytime connection is lost.Have you tried anything?
  • Dipanki Jadav
    Dipanki Jadav over 7 years
    @moDev I can not handel the disconnection in closed() closed is not call so I can not call reconnect.
  • BNK
    BNK over 7 years
    @DipankiJadav have you tried using LongPollingTransport yet?
  • M.Yogeshwaran
    M.Yogeshwaran over 7 years
    can you please share server side code am getting java.lang.InterruptedException: Operation was cancelled
  • BNK
    BNK over 7 years
    @M.Yogeshwaran the server side code is on top of my answer already
  • M.Yogeshwaran
    M.Yogeshwaran over 7 years
    am getting operation was cancelled exception don't know why
  • M.Yogeshwaran
    M.Yogeshwaran over 7 years
    @BNK can you please take a look at this stackoverflow.com/q/40231733/5498065
  • BNK
    BNK over 7 years
    @M.Yogeshwaran since I am busy now, so please try my sample project at github.com/ngocchung/SimpleSignalRClient, there you will find a link to server side code (i.e asp.net/signalr/overview/getting-started/…). Hope it helps!
  • Dipanki Jadav
    Dipanki Jadav over 7 years
    @moDev Can you please provide the code which you implemented for solve issue of disconnection of signlr while app is idle or due Internet connection. Please help me
  • moDev
    moDev over 7 years
    @DipankiJadav Let me know your code. I'll surely help.
  • M.Yogeshwaran
    M.Yogeshwaran over 7 years
    @moDev BNK DipankiJadav i have successfully created the working hub but my doubt is it possible to generate notification when application in background like whatsapp,facebook from android using signalr
  • Umar Farooque
    Umar Farooque over 7 years
    I am using the same code base and can send message but I cant receive any... Can anyone help me ? My control doesnt go inside "SubscriptionHandler1"
  • BNK
    BNK over 7 years
    @UmarFarooque I think you should check the connection between android client and web server first, you can also set breakpoints inside your server side code, then debug
  • Umar Farooque
    Umar Farooque over 7 years
    @BNK Ok I will be adding logs for receving method at the server. Would get back to you incase I need some help.
  • Umar Farooque
    Umar Farooque over 7 years
    @BNK what seemed to work for me is described in this stackoverflow.com/a/40520578/2570153 The method "mHubProxy.on()" gives no callback in my project.
  • BNK
    BNK over 7 years
    @UmarFarooque glad that your issue has been solved. About connection.received(new MessageReceivedHandler() , actually I have used it inside one of my projects before, but then commented already. About mHubProxy.on, have you made sure that their pararameters' values are correct and exactly the same as the server code? I mean method name (i.e broadcastMessage, class name (i.e String or CustomMessage...). One more thing, does your project use the 2 jar files look like the files at github.com/ngocchung/SimpleSignalRClient/tree/master/app/lib‌​s?
  • Umar Farooque
    Umar Farooque over 7 years
    Yes my project does use the same jar as mentioned in the link. As far as naming is concerned. I did match it with server. If you want or can check it.. I could post my method name, return, etc
  • BNK
    BNK over 7 years
    @UmarFarooque ok, if you post it, please post to pastebin
  • BNK
    BNK over 7 years
    @UmarFarooque please post server-side code also, and why CustomMessage and CustomMsg? They are different
  • Umar Farooque
    Umar Farooque over 7 years
    @BNK it was a typo, CustomMessage and CustomMsg are same. Also, I'll post the server code for this msg soon and update.
  • Umar Farooque
    Umar Farooque over 7 years
    @BNK Hi ! This is the function on server end. pastebin.com/7A9geVGD . Please help me out with it. The "mHubProxy.on() method is giving multiple duplicates.
  • Umar Farooque
    Umar Farooque over 7 years
    @BNK this is the updated code i am using in my client where i receive callback in mhubproxy.on() method. pastebin.com/F9PBcJCK
  • BNK
    BNK over 7 years
    @UmarFarooque at server code, Clients.All.addNewMessageToPage(name, message, day, hour, avatar); which has 5 parameters (String, Integer types...), however, in android code, you used mHubProxy.on("addNewMessageToPage", new SubscriptionHandler1<JsonElement>() { so that's why it's not called. Pls review my code above
  • Umar Farooque
    Umar Farooque over 7 years
    @BNK i tried with 5 parameters i.e. SubscriptionHandler5 and all my parameters are string type but i got stack over flow exception.
  • BNK
    BNK over 7 years
    @UmarFarooque try using POJO class ChatMessage with 5 member variables instead of 2, and also SubscriptionHandler1 as in my sample code
  • Mohamed Nageh
    Mohamed Nageh almost 7 years
    thanks i needed this part "For catch all message can use this"
  • rukiman
    rukiman almost 6 years
    Does this client work with v2.3.0 of the SignalR .net library? See more details here: stackoverflow.com/questions/51165953/signalr-v2-3-0-in-andro‌​id
  • reyhane
    reyhane over 4 years
    I've implemented an Android chat application with Signal R. Everything is working fine but the problem is that I don't get a message when the Android app is completely closed. I don't close my connection. Do you have a solution to this problem?
  • BNK
    BNK over 4 years
    @reyhane sorry bro, I haven't developed Android for years, cannot be sure now. Sorry
  • Edgar
    Edgar about 3 years
    @Saied Mohammadi why do you think signal r not workingin redmi devices I am sending messages but in the chat it is not showing
  • Saeid Mohammadi
    Saeid Mohammadi about 3 years
    @sashabeliy did you test on other device?