How to use signalr in Android
Asked Answered
P

5

38

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();

    }
}
Pommard answered 14/9, 2015 at 20:58 Comment(6)
Your "mHubProxy.invoke" looks different from mine, I wonder if it is the same as your server Hub definition or not. Its first parameter is a blank String? Moreover, where do you use "string" variable?Amory
@Amory I want to receive callback from invoke and for that I have used new String()Pommard
Hi! Now I understand your idea about response from invoke, you use public <E> SignalRFuture<E> invoke(final Class<E> resultClass, final String method, Object... args) :)Amory
Why don't you try String.class instead of new String() such as mHub.invoke(String.class, "hello", "123").done(new Action<String>() { @Override public void run(String s) throws Exception { } }).onError(new ErrorCallback() { @Override public void onError(Throwable throwable) { } });Amory
I have just tested with your server Url http://transit.alwaysaware.org/signalr, perhaps your server Hub name is not ChatHub, because my app got [InvalidOperationException]: &#39;chathub&#39; Hub could not be resolved.Amory
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?Kingkingbird
A
44

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

Amory answered 14/9, 2015 at 22:19 Comment(68)
How to check if connection is establishedPommard
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?Pommard
I am getting error java.util.concurrent.ExecutionException: microsoft.aspnet.signalr.client.transport.NegotiationException: There was a problem in the negotiation with the serverPommard
Can you post your code? Both client and server app.Amory
I can post client side code. I don't have access to server code.Pommard
I've just changed hub name and app got hanged with blank screen.Pommard
How to receive response from same method using invoke?Pommard
Let us continue this discussion in chat.Pommard
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 :-)Amory
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 wrongPommard
You can write your own sample SignalR server app to test with your Android client appAmory
I am an mobile developer, so can't do it.Pommard
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 thoughPommard
Sorry I cannot help you solve your issue. IMO, you can create your own apps to test at home if you have time. Goodluck!Amory
Android code that you posted works for you?? Why it hangs entire application and displays black background unless app is forced closed?Pommard
Of course it works with my own ASP.NET server app :-)Amory
can you show how to receive response via callback in invoke method?Pommard
As you have seen, android client receives response inside SubscriptionHandler1Amory
Ah, I have reviewed your code more, you should implement SubscriptionHandler1 to receive server responseAmory
Glad it finally helps you!Amory
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?Pommard
Do you mean that your server app returned JSON? I think it returned a List instead, for example List<Product>Amory
I found the solution for JSON. Thanks for your help.Pommard
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 alwaysPommard
can you help on this?Pommard
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?Amory
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!Amory
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!Amory
asp.net/signalr/overview/guide-to-the-api/…Amory
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?Pommard
Sorry, I am not sure about thatAmory
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?Pommard
If WIFI is connected then start without any parameter else start with long polling transport parameterPommard
Sorry, I have not any app in store :).Amory
@Amory Awesome answer! I had a very similar issue in SignalR Android. Can you have a look please? #35265335Devi
@Amory 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 meBreach
@DipankiJadav sorry I can't help now, however, I think you can search more in SO about the permanent service in Android, for example #15759480Amory
@Pommard 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 timeBreach
@Amory Hello Please help me to solve the issue of Signlr disconnection due to internet problem or when App is Idle for longer timeBreach
@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 notAmory
@DipankiJadav You need to reconnect everytime connection is lost.Have you tried anything?Pommard
@Pommard I can not handel the disconnection in closed() closed is not call so I can not call reconnect.Breach
@DipankiJadav have you tried using LongPollingTransport yet?Amory
can you please share server side code am getting java.lang.InterruptedException: Operation was cancelledStandoff
@Standoff the server side code is on top of my answer alreadyAmory
am getting operation was cancelled exception don't know whyStandoff
@Amory can you please take a look at this https://mcmap.net/q/411162/-operation-was-cancelled-exception-when-trying-to-connect-signlar-with-my-app/5498065Standoff
@Standoff 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!Amory
@Pommard 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 meBreach
@DipankiJadav Let me know your code. I'll surely help.Pommard
@Pommard 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 signalrStandoff
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"Ruthieruthless
@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 debugAmory
@Amory Ok I will be adding logs for receving method at the server. Would get back to you incase I need some help.Ruthieruthless
@Amory what seemed to work for me is described in this https://mcmap.net/q/411163/-android-app-did-not-receive-data-from-signalr-hub The method "mHubProxy.on()" gives no callback in my project.Ruthieruthless
@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/libs?Amory
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, etcRuthieruthless
@UmarFarooque ok, if you post it, please post to pastebinAmory
@UmarFarooque please post server-side code also, and why CustomMessage and CustomMsg? They are differentAmory
@Amory it was a typo, CustomMessage and CustomMsg are same. Also, I'll post the server code for this msg soon and update.Ruthieruthless
@Amory 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.Ruthieruthless
@Amory this is the updated code i am using in my client where i receive callback in mhubproxy.on() method. pastebin.com/F9PBcJCKRuthieruthless
@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 aboveAmory
@Amory i tried with 5 parameters i.e. SubscriptionHandler5 and all my parameters are string type but i got stack over flow exception.Ruthieruthless
@UmarFarooque try using POJO class ChatMessage with 5 member variables instead of 2, and also SubscriptionHandler1 as in my sample codeAmory
Does this client work with v2.3.0 of the SignalR .net library? See more details here: https://mcmap.net/q/411164/-signalr-v2-3-0-in-androidClaudioclaudius
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?Kingkingbird
@Kingkingbird sorry bro, I haven't developed Android for years, cannot be sure now. SorryAmory
M
2

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();
                    }
                });
            }
        });
Mowery answered 1/3, 2017 at 9:29 Comment(1)
thanks i needed this part "For catch all message can use this"Dandify
A
2

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

Abreu answered 13/2, 2019 at 22:34 Comment(0)
G
1

do this tutorial step by step : https://learn.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>
Gaucho answered 6/12, 2020 at 9:11 Comment(2)
@Saied Mohammadi why do you think signal r not workingin redmi devices I am sending messages but in the chat it is not showingMadelinemadella
@sashabeliy did you test on other device?Gaucho
R
0

For those who are implementing signalR client in android and the given answer here doesn't help in receiving the messages can check out this answer by rejnev.

The answer implements a different method connection.received() which is able to receive message callbacks from the server in my case.

Ruthieruthless answered 16/11, 2016 at 6:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.