mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2025-06-28 20:29:53 +00:00
android: Fix of StackoverflowError (#1322)
* android: Fix of StackoverflowError
* Break
* Comment
* Update apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt
* Revert "Update apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt"
This reverts commit ea8015e01d
.
Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
This commit is contained in:
parent
adfe20b54c
commit
c8b2bcb064
1 changed files with 23 additions and 19 deletions
|
@ -264,8 +264,20 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a
|
||||||
private fun startReceiver() {
|
private fun startReceiver() {
|
||||||
Log.d(TAG, "ChatController startReceiver")
|
Log.d(TAG, "ChatController startReceiver")
|
||||||
if (receiverStarted) return
|
if (receiverStarted) return
|
||||||
thread(name="receiver") {
|
receiverStarted = true
|
||||||
GlobalScope.launch { withContext(Dispatchers.IO) { recvMspLoop() } }
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
while (true) {
|
||||||
|
/** Global [ctrl] can be null. It's needed for having the same [ChatModel] that already made in [ChatController] without the need
|
||||||
|
* to change it everywhere in code after changing a database.
|
||||||
|
* Since it can be changed in background thread, making this check to prevent NullPointerException */
|
||||||
|
val ctrl = ctrl
|
||||||
|
if (ctrl == null) {
|
||||||
|
receiverStarted = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
val msg = recvMsg(ctrl)
|
||||||
|
if (msg != null) processReceivedMsg(msg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,26 +303,18 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun recvMsg(ctrl: ChatCtrl): CR? {
|
private fun recvMsg(ctrl: ChatCtrl): CR? {
|
||||||
return withContext(Dispatchers.IO) {
|
val json = chatRecvMsgWait(ctrl, MESSAGE_TIMEOUT)
|
||||||
val json = chatRecvMsgWait(ctrl, MESSAGE_TIMEOUT)
|
return if (json == "") {
|
||||||
if (json == "") {
|
null
|
||||||
null
|
} else {
|
||||||
} else {
|
val r = APIResponse.decodeStr(json).resp
|
||||||
val r = APIResponse.decodeStr(json).resp
|
Log.d(TAG, "chatRecvMsg: ${r.responseType}")
|
||||||
Log.d(TAG, "chatRecvMsg: ${r.responseType}")
|
if (r is CR.Response || r is CR.Invalid) Log.d(TAG, "chatRecvMsg json: $json")
|
||||||
if (r is CR.Response || r is CR.Invalid) Log.d(TAG, "chatRecvMsg json: $json")
|
r
|
||||||
r
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun recvMspLoop() {
|
|
||||||
val msg = recvMsg(ctrl ?: return)
|
|
||||||
if (msg != null) processReceivedMsg(msg)
|
|
||||||
recvMspLoop()
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun apiGetActiveUser(): User? {
|
suspend fun apiGetActiveUser(): User? {
|
||||||
val r = sendCmd(CC.ShowActiveUser())
|
val r = sendCmd(CC.ShowActiveUser())
|
||||||
if (r is CR.ActiveUser) return r.user
|
if (r is CR.ActiveUser) return r.user
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue