From 14379551e91b92c3b8da56699485d0e3ecb43005 Mon Sep 17 00:00:00 2001 From: Filipe de Lima Brito Date: Mon, 11 Mar 2019 17:09:16 +0000 Subject: [PATCH] Revert "[REFACTOR] Coroutines yield" --- .../chatrooms/viewmodel/ChatRoomsViewModel.kt | 16 +++++++++++++--- .../server/infraestructure/ConnectionManager.kt | 4 +++- app/src/main/java/chat/rocket/android/util/IO.kt | 14 ++++++++++---- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatrooms/viewmodel/ChatRoomsViewModel.kt b/app/src/main/java/chat/rocket/android/chatrooms/viewmodel/ChatRoomsViewModel.kt index 07d1327a68..90d097eaa0 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/viewmodel/ChatRoomsViewModel.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/viewmodel/ChatRoomsViewModel.kt @@ -22,11 +22,14 @@ import com.shopify.livedataktx.map import com.shopify.livedataktx.nonNull import kotlinx.coroutines.experimental.android.UI import kotlinx.coroutines.experimental.delay +import kotlinx.coroutines.experimental.isActive import kotlinx.coroutines.experimental.launch import kotlinx.coroutines.experimental.newSingleThreadContext import kotlinx.coroutines.experimental.withContext -import kotlinx.coroutines.experimental.yield import timber.log.Timber +import java.lang.IllegalArgumentException +import kotlin.coroutines.experimental.coroutineContext + class ChatRoomsViewModel( private val connectionManager: ConnectionManager, @@ -50,11 +53,18 @@ class ChatRoomsViewModel( // debounce, to not query while the user is writing delay(200) + // TODO - find a better way for cancellation checking + if (!coroutineContext.isActive) return@wrap + val rooms = repository.search(string).let { mapper.map(it, showLastMessage = this.showLastMessage) } data.postValue(rooms.toMutableList() + LoadingItemHolder()) - yield() + + + if (!coroutineContext.isActive) return@wrap + val spotlight = spotlight(query.query)?.let { mapper.map(it, showLastMessage = this.showLastMessage) } - yield() + if (!coroutineContext.isActive) return@wrap + spotlight?.let { data.postValue(rooms.toMutableList() + spotlight) }.ifNull { diff --git a/app/src/main/java/chat/rocket/android/server/infraestructure/ConnectionManager.kt b/app/src/main/java/chat/rocket/android/server/infraestructure/ConnectionManager.kt index fc99f6c2f1..31fb21dd6b 100644 --- a/app/src/main/java/chat/rocket/android/server/infraestructure/ConnectionManager.kt +++ b/app/src/main/java/chat/rocket/android/server/infraestructure/ConnectionManager.kt @@ -295,7 +295,7 @@ class ConnectionManager( val batch = ArrayList(maxSize) var deadline = 0L // deadline for sending this batch to callback block - while(isActive) { + while(true) { // when deadline is reached or size is exceeded, pass the batch to the callback block val remainingTime = deadline - System.currentTimeMillis() if (batch.isNotEmpty() && remainingTime <= 0 || batch.size >= maxSize) { @@ -317,6 +317,8 @@ class ConnectionManager( // when timeout is reached just finish select, note: no timeout when batch is empty if (batch.isNotEmpty()) onTimeout(remainingTime.orZero()) {} } + + if (!isActive) break } } } diff --git a/app/src/main/java/chat/rocket/android/util/IO.kt b/app/src/main/java/chat/rocket/android/util/IO.kt index ab0b313865..e1e17d3356 100644 --- a/app/src/main/java/chat/rocket/android/util/IO.kt +++ b/app/src/main/java/chat/rocket/android/util/IO.kt @@ -5,7 +5,6 @@ import chat.rocket.common.RocketChatNetworkErrorException import kotlinx.coroutines.experimental.TimeoutCancellationException import kotlinx.coroutines.experimental.delay import kotlinx.coroutines.experimental.isActive -import kotlinx.coroutines.experimental.yield import timber.log.Timber import kotlin.coroutines.experimental.coroutineContext @@ -22,17 +21,20 @@ suspend fun retryIO( { var currentDelay = initialDelay repeat(times - 1) { currentTry -> - yield() + if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled") try { return block() } catch (e: RocketChatNetworkErrorException) { Timber.d(e, "failed call($currentTry): $description") e.printStackTrace() } + + if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled") delay(currentDelay) currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelay) } - yield() + + if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled") return block() // last attempt } @@ -46,15 +48,19 @@ suspend fun retryDB( { var currentDelay = initialDelay repeat(times - 1) { currentTry -> + if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled") try { return block() } catch (e: SQLiteDatabaseLockedException) { Timber.d(e, "failed call($currentTry): $description") e.printStackTrace() } + + if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled") delay(currentDelay) currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelay) } - yield() + + if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled") return block() // last attempt } \ No newline at end of file