myanmarking
01/07/2019, 5:50 PMmainScore = CoroutineScope(dispatchers.MAIN + job)
i have thismyanmarking
01/07/2019, 5:50 PMAllan Wang
01/07/2019, 5:51 PMzak.taccardi
01/07/2019, 5:51 PMwithContext
to switch a dispatcher, not async{ }.await()
.
Also in general you should avoid throwing exceptions and instead return values if you want predictable results and not weirdness like what you are experiencing nowmyanmarking
01/07/2019, 5:52 PMAllan Wang
01/07/2019, 5:53 PMzak.taccardi
01/07/2019, 5:53 PM.await()
on your Deferred
returned by async
zak.taccardi
01/07/2019, 5:54 PMtry/catch
needs to wrap the .await()
call on the async
myanmarking
01/07/2019, 5:54 PMmyanmarking
01/07/2019, 5:56 PMmyanmarking
01/07/2019, 5:56 PMclass SomeClass @Inject constructor(...
) {
private val job = Job()
private val mainScope = CoroutineScope(dispatchers.MAIN + job)
private fun onSaveDataToServer() {
val userId = sessionInfo.loggedInUserId
mainScope.launch {
try{
val attr1 = async(<http://dispatchers.IO|dispatchers.IO>) { networkUser.setUserAttrs(...).awaitFirst() }
val attr2 = async(<http://dispatchers.IO|dispatchers.IO>) { networkUser.setUserAttrs(...).awaitFirst() }
val attr3 = async(<http://dispatchers.IO|dispatchers.IO>) { networkUser.setUserAttrs(...).awaitFirst() }
awaitAll(attr1, attr2, attr3, prefs)
...
}catch (e: Exception){
Timber.e(e)
...
}finally {
...
}
}
}
override fun onCleared() {
mainScore.coroutineContext.cancelChildren()
}
}
myanmarking
01/07/2019, 5:56 PMmyanmarking
01/07/2019, 5:57 PMsetUserAttrs
is an observable, i can't change it, so i use the extension awaitFirstzak.taccardi
01/07/2019, 6:02 PMsetUserAttrs() : Observable<T>
is what crashes?myanmarking
01/07/2019, 6:02 PMmyanmarking
01/07/2019, 6:03 PMAllan Wang
01/07/2019, 6:07 PMAllan Wang
01/07/2019, 6:07 PMmyanmarking
01/07/2019, 6:07 PMAllan Wang
01/07/2019, 6:07 PMmyanmarking
01/07/2019, 6:07 PMAllan Wang
01/07/2019, 6:08 PMmyanmarking
01/07/2019, 6:08 PMmyanmarking
01/07/2019, 6:08 PMmyanmarking
01/07/2019, 6:17 PMmyanmarking
01/07/2019, 6:18 PMmyanmarking
01/07/2019, 6:20 PMmyanmarking
01/07/2019, 6:20 PMfun doWork() {
mainScore.launch {
try {
withContext(Dispatchers.Unconfined) {
val attr1 = async { networkCall().awaitFirst() }
attr1.await()
}
} catch (e: Exception) { }
}
}
myanmarking
01/07/2019, 6:20 PMzak.taccardi
01/07/2019, 6:22 PMasync(<http://dispatchers.IO|dispatchers.IO>) {
networkUser.setUserAttrs(...).awaitFirst()
}
with:
async(<http://dispatchers.IO|dispatchers.IO>) {
throw Exception("test test")
}
Do you have the same issue?myanmarking
01/07/2019, 6:23 PMzak.taccardi
01/07/2019, 6:23 PMasync(<http://dispatchers.IO|dispatchers.IO>)
- you are changing the contextzak.taccardi
01/07/2019, 6:23 PMasync(coroutineContext + <http://dispatchers.IO|dispatchers.IO>)
would have the same problemmyanmarking
01/07/2019, 6:24 PMmyanmarking
01/07/2019, 6:24 PMwithContext
and set the dispatcher there workszak.taccardi
01/07/2019, 6:24 PMasync {
withContext(<http://dispatchers.IO|dispatchers.IO>) { }
}
Allan Wang
01/07/2019, 6:24 PMmyanmarking
01/07/2019, 6:25 PMmyanmarking
01/07/2019, 6:26 PMmyanmarking
01/07/2019, 6:26 PMzak.taccardi
01/07/2019, 6:31 PMAllan Wang
01/07/2019, 6:32 PMmyanmarking
01/07/2019, 6:33 PMmyanmarking
01/07/2019, 6:35 PMAllan Wang
01/07/2019, 6:36 PMmyanmarking
01/07/2019, 6:37 PMAllan Wang
01/07/2019, 6:41 PMmyanmarking
01/07/2019, 6:42 PMuli
01/08/2019, 6:51 AMAllan Wang
01/08/2019, 5:52 PMuli
01/08/2019, 8:27 PMAllan Wang
01/08/2019, 8:31 PMlaunch
was only supposed to log exceptions by defaultmyanmarking
01/09/2019, 10:26 AM