RxKotlin与Android中的Socket.io

时间:2018-03-13 13:40:15

标签: android socket.io kotlin rx-kotlin2

我要做的是监听套接字数据并转换为可观察的字符串,我的UI可以订阅此事件并在UI上进行更改

到目前为止,我创建了一个类SocketConnection维护,在dagger连接中正确发生并接收数据并且能够正确处理接口,但是想要应用rxkotlin。

使用Socket.io,kotlin

SocketConnection类

it('should call the change detector',
    () => {
        const spyCDR = spyOn((cmp as any), 'detectChanges' as any);
        cmp.ngOnInit();
        expect(spyCDR).toHaveBeenCalled();
    }
);

存储库

 class SocketConnection : SocketStreamListener {

    private var socket: Socket? = null

   var responseSocket :ResponseHandler?= null
    companion object {
        var instance = SocketConnection()

    }

    override fun createSocket(socketQuery: SocketQuery): Socket? {
        try {
            val okHttpClient = UnsafeOkHttpClient.getUnsafeOkHttpClient()
            IO.setDefaultOkHttpWebSocketFactory(okHttpClient)
            IO.setDefaultOkHttpCallFactory(okHttpClient)
            val opts = IO.Options()
            opts.reconnection = false
            opts.callFactory = okHttpClient
            opts.webSocketFactory = okHttpClient
            opts.query = "userID=" + socketQuery.userID + "&token=" + socketQuery.token
            socket = IO.socket(CommonContents.BASE_API_LAYER, opts)
            L.d("Socket object created")
        } catch (e: URISyntaxException) {
            L.e("Error creating socket", e)
        }
        return socket
    }

    override fun createSocketListener(socket: Socket) {
        L.d("inside the socket Listner")
        socket.connect()?.on(Socket.EVENT_CONNECT, {
            L.d("connected")
            listenSocketEvents()
            //socketDataListener()
            createMessageListener()

        })?.on(Socket.EVENT_DISCONNECT,
                {
                    L.d("disconnected")
                    return@on
                })

    }


    /**
     * function used to listen a socket chanel data
     */
    private fun listenSocketEvents() {


       /* socket?.on("1502", { args ->
      // This Will Work 
             L.d("Socket market depth event successfully")
            val socketData = args[0] as String
            L.d(socketData)
         //   instance.data = Observable.just(socketData)
            //data!!.doOnNext({ socketData })

            *//*
            data = args[0] as String
             for (i in 0 until arr.size) {
                 arr[i].socketStreamingData(data)
             }*//*

        })*/

    }

// This Will Not Work
    fun socketDataListener(): Observable<String>{
      return Observable.create({
          subscibe ->
         // L.d("Socket market depth event successfully")
            socket?.on("1502", { args ->
                L.d("Socket market depth event successfully")
                val socketData = args[0] as String
                subscibe.onNext(socketData)
            })

        })
    }

  }

视图模型

fun getSocketData(): Observable<String> {
   // L.e("" + SocketConnection.instance.socketDataListener())
    return SocketConnection.instance.createMessageListener()
}

OnFragement(UI)

fun getSocketData(): Observable<String>{
    return groupRepository.getSocketData()
}

在此UI中使用一次性订阅方法进入基类。

请事先告诉我我做错了什么

1 个答案:

答案 0 :(得分:0)

除了每次发送消息时都创建Observable,我建议使用Subject,因为它具有与Socket连接类似的“性质”。

   val subject = PublishSubject.create<String>()
   ...

    fun listenSocketEvents() {
      socket?.on("1502") { args ->
        val socketData = args[0] as String
        subject.onNext(socketData)
      }
    }

    fun observable(): Observable<String>{
        return subject
    }

然后,您可以通过(不包括存储库层等,您必须自己执行此操作)来监听主题的更改。

private fun getSocketUpdate() {
    disposable = socketConnection.observable()
            .subscribeOn(Schedulers.io())
            .observeOn(...)
            .subscribe({...}, {...})
}

作为旁注,你的单例实例不是你在kotlin中那样做的。 您应该将类​​声明为instance,而不是companion object中有object SocketConnection字段。 这将自动为您提供所有单例功能。 (我不知道在socket.io中使用单例是否聪明,但我认为你知道你在做什么:-))