Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Better way of checking if socket is connected or disconnected using OkHttp?

I'm using OkHttp for sending and receiving messages through socket on Android.

Creating a socket connection -

SocketListener listener = new SocketListener();

mOkHttpClient = new OkHttpClient.Builder()
    .readTimeout(0, TimeUnit.MILLISECONDS)
    .build();
Request request = new Request.Builder()
    .url(socketURL)
    .build();
mOkHttpClient.newWebSocket(request, listener);

And this is the SocketListener class that is used to listen to all the web socket events -

public final class SocketListener extends WebSocketListener { 
    @Override
    public void onOpen(WebSocket webSocket, Response response) {
       // doing something
       isSocketConnected = true;
    }

    @Override
    public void onMessage(WebSocket webSocket, String text) {
       // doing something
    }

    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
    }

    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
       // doing something
       isSocketConnected = true;
    }

    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
       isSocketConnected = false;
    }

}

Sometimes the socket connection drops and as you can see, I'm using isSocketConnected variable on SocketListener class to keep track of 'if socket is connected or disconnected'.

Can there be a better way to check if the socket is connected or disconnected ?

like image 553
Asutosh Panda Avatar asked Mar 01 '18 11:03

Asutosh Panda


People also ask

What is the use of OkHttp?

OkHttp is an HTTP client from Square for Java and Android applications. It's designed to load resources faster and save bandwidth. OkHttp is widely used in open-source projects and is the backbone of libraries like Retrofit, Picasso, and many others.

Does OkHttp support Websocket?

Unlike the traditional request/response model of HTTP, web sockets provide fully bi-directional streaming of messages. This means that both the client and the server can send any number of messages to the other peer at any time. With today's version 3.5 release, OkHttp now offers native support for web sockets!

How do I use OkHttp on Android?

OkHttp Query Parameters Example Builder urlBuilder = HttpUrl. parse("https://httpbin.org/get).newBuilder(); urlBuilder. addQueryParameter("website", "www.journaldev.com"); urlBuilder. addQueryParameter("tutorials", "android"); String url = urlBuilder.


1 Answers

This is Tinder Scarlet method to solve by using Rx

internal class OkHttpWebSocketEventObserver : WebSocketListener() {
    private val processor = PublishProcessor.create<WebSocket.Event>().toSerialized()

    fun observe(): Flowable<WebSocket.Event> = processor

    fun terminate() = processor.onComplete()

    override fun onOpen(webSocket: okhttp3.WebSocket, response: Response) =
        processor.onNext(WebSocket.Event.OnConnectionOpened(webSocket))

    override fun onMessage(webSocket: okhttp3.WebSocket, bytes: ByteString) =
        processor.onNext(WebSocket.Event.OnMessageReceived(Message.Bytes(bytes.toByteArray())))

    override fun onMessage(webSocket: okhttp3.WebSocket, text: String) =
        processor.onNext(WebSocket.Event.OnMessageReceived(Message.Text(text)))

    override fun onClosing(webSocket: okhttp3.WebSocket, code: Int, reason: String) =
        processor.onNext(WebSocket.Event.OnConnectionClosing(ShutdownReason(code, reason)))

    override fun onClosed(webSocket: okhttp3.WebSocket, code: Int, reason: String) =
        processor.onNext(WebSocket.Event.OnConnectionClosed(ShutdownReason(code, reason)))

    override fun onFailure(webSocket: okhttp3.WebSocket, t: Throwable, response: Response?) =
        processor.onNext(WebSocket.Event.OnConnectionFailed(t))
}
like image 174
Alexey Avatar answered Sep 25 '22 13:09

Alexey