Я пытаюсь сохранить сокетное соединение через приложение для 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 и делаю что-то неправильно?На самом деле пример синглтона действительно смутил меня и сказал, что я сейчас делаю.