Java-клиент Socket.io класса Singleton не передает данные - как использовать сокет-соединение через приложение - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь сохранить сокетное соединение через приложение для Android, используя SocketHandler синглтон-класс.

class SocketHandler {

    private lateinit var socketHandler:SocketHandler
    private lateinit var userData: JSONObject

    var socket: Socket =  IO.socket("http://qweqweqwe.ngrok.io")

    fun onSocketConnected(userDataHolder: JSONObject){

        userData = userDataHolder
        socket.emit("newClient",userData) // this data is emited





    }

    fun getInstance():SocketHandler{
        if(!::socketHandler.isInitialized){
            socketHandler = SocketHandler()
        }
        return socketHandler
    }




    fun joinGame(gameData:JSONObject){

            socket.emit("joinTableSoccer",gameData) // this data is not emited.







    }


    fun connect(userData:JSONObject){

        socket.connect()
                .on(Socket.EVENT_CONNECT) { onSocketConnected(userData)

                }






    }

}

Обратите внимание onSocketConnected() и joinGame().Сообщение, которое я посылаю после успешного подключения, но joinGame() emit не является успешным.

Вот как я инициализирую соединение и вызываю joinGame из другого действия:

  SocketHandler().getInstance().connect(data) // succesfully connects and then emits.
                    var gameData: JSONObject = JSONObject()
                    gameData.put("gameName", "tableSoccer");
                    gameData.put("roomName", "myRoom");

                    SocketHandler().getInstance().joinGame(gameData) // does not emit 

Когда япроверьте, что переменная сокета внутри присоединенной функции joinGame равна false.Это означает, что я не могу нести статус подключенного сокета через мое приложение.Почему ?и как это сделать?

Обновление: я отредактировал свой синглтон-класс на основе этого ответа: https://stackoverflow.com/a/17606768/9382668

class SocketHandler {

    private lateinit var instance:SocketHandler
    private lateinit var userData: JSONObject
    private lateinit var socket:Socket

    fun onSocketConnected(userDataHolder: JSONObject){

        userData = userDataHolder
        SocketHandler().socket.emit("newClient",userData)






    }

    fun initInstance(userDataHolder:JSONObject):SocketHandler{
        if(!::instance.isInitialized){
            instance = SocketHandler()
            var socket: Socket =  IO.socket("http://ce5189dc.ngrok.io")

            SocketHandler().socket = socket
            SocketHandler().connectServer(userDataHolder)

        }
        return instance
    }




    fun joinGame(gameData:JSONObject){
        Log.d("mylog","join game called")
        var data:JSONObject = JSONObject()
        data.put("roomName", gameData.get("roomName"));

        SocketHandler().socket.emit("joinTableSoccer",data)


    }


    fun connectServer(userData:JSONObject){

        SocketHandler().socket.connect() //throws uninitialized
                .on(Socket.EVENT_CONNECT) { onSocketConnected(userData)

                }






    }

}

Но на этот раз connectServer методы SocketHandler().socket.connect() строкаВыдает SocketHandler не инициализированную ошибку. Это потому, что пример с Java, и я использую kotlin и делаю что-то неправильно?На самом деле пример синглтона действительно смутил меня и сказал, что я сейчас делаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...