Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ ScopedActivity ] Job was cancelled #1649

Closed
tperraut opened this issue Nov 7, 2019 · 7 comments
Closed

[ ScopedActivity ] Job was cancelled #1649

tperraut opened this issue Nov 7, 2019 · 7 comments

Comments

@tperraut
Copy link

tperraut commented Nov 7, 2019

I implemented the ScopedActivity like described here with a CoroutineExceptionHandler like this :

abstract class ScopedActivity : BaseActivity(), CoroutineScope by MainScope() {

    val errorHandler by lazy { CoroutineExceptionHandler { _, throwable -> onError(throwable) } }

    open fun onError(e: Throwable? = null) {
        e ?: return
        Timber.i(e)
    }

    override fun onDestroy() {
        super.onDestroy()
        cancel()
    }
}

And of course my activities inherit of ScopedActivity and launch coroutines like this :

launch(errorHandler) {
            // Like this
            someKotlinFlow.collect { manageState(it) }
           // or like this when I need to launch more stuff in the same coroutine
            someKotlinFlow.onEach { manageState(it) }.launchIn(this)
           ...
}

So all exceptions are catched and I just have to override the onError method to manage errors and retry what I want.

The issue is that my users are experiencing random crashes I cannot reproduce and the only information I get is : "Job was cancelled".
So how can I spot where that exception comes from ? Is it Flow related or not ? Am I doing it wrong?

More code is available here stackoverflow link

@tperraut
Copy link
Author

tperraut commented Nov 8, 2019

Here is the behavior I described and should work as expected but it does not work in my android app

@zach-klippenstein
Copy link
Contributor

Do you have stacktraces from those crashes? Without that and seeing all your actual code it's impossible to say what's actually crashing.

The only thing that looks potentially problematic in your code is that you require all launches to remember to pass the handler in. It would be simpler and safer to put the handler inside your activity scope instead so all coroutines launched in that scope get it automatically.

@zach-klippenstein
Copy link
Contributor

Unrelated to correctness, but it's also worth noting that it's no longer considered idiomatic to make activities implement CoroutineScope directly, it's better to have an explicit private scope property.

@tperraut
Copy link
Author

@zach-klippenstein thank you for your answer ! I changed my ScopedActivity as you said to not pass the handler to all my launch but it is still the same.

abstract class ScopedActivity : BaseActivity(), CoroutineScope {

    private val errorHandler = CoroutineExceptionHandler { _, throwable -> onError(throwable) }

    override val coroutineContext: CoroutineContext = Dispatchers.Main + SupervisorJob() + errorHandler

    open fun onError(e: Throwable? = null) {
        e ?: return
        Timber.i(e)
    }

    override fun onDestroy() {
        super.onDestroy()
        cancel()
    }
}

For the stacktrace what I get is really not useful, here it is in full :

Fatal Exception: kotlinx.coroutines.t1: Job was cancelled


#0. FrameMetricsAggregator
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at android.os.HandlerThread.run + 65(HandlerThread.java:65)

#1. androidmapsapi-its_ter
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at com.google.maps.api.android.lib6.gmm6.store.k.run + 128(k.java:128)

#2. pool-10-thread-1
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1120(ScheduledThreadPoolExecutor.java:1120)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#3. Crashlytics Exception Handler1
       at dalvik.system.VMStack.getThreadStackTrace(VMStack.java)
       at java.lang.Thread.getStackTrace + 1558(Thread.java:1558)
       at java.lang.Thread.getAllStackTraces + 1608(Thread.java:1608)
       at com.crashlytics.android.core.CrashlyticsController.a + 102(CrashlyticsController.java:102)
       at com.crashlytics.android.core.CrashlyticsController.b + 80(CrashlyticsController.java:80)
       at com.crashlytics.android.core.CrashlyticsController.access$1200(CrashlyticsController.java)
       at com.crashlytics.android.core.CrashlyticsController$7.call + 17(CrashlyticsController.java:17)
       at com.crashlytics.android.core.CrashlyticsController$7.call(CrashlyticsController.java)
       at java.util.concurrent.FutureTask.run + 266(FutureTask.java:266)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1187(ThreadPoolExecutor.java:1187)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at io.fabric.sdk.android.services.common.ExecutorUtils$1$1.a + 2(ExecutorUtils.java:2)
       at io.fabric.sdk.android.services.common.BackgroundPriorityRunnable.run + 5(BackgroundPriorityRunnable.java:5)
       at java.lang.Thread.run + 784(Thread.java:784)

#4. RxComputationThreadPool-1
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1120(ScheduledThreadPoolExecutor.java:1120)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#5. RxComputationThreadPool-3
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 230(LockSupport.java:230)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos + 2101(AbstractQueuedSynchronizer.java:2101)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1132(ScheduledThreadPoolExecutor.java:1132)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#6. OkHttp ConnectionPool
       at java.lang.Object.wait(Object.java)
       at okhttp3.internal.Util.a + 13(Util.java:13)
       at okhttp3.internal.Util.a + 15(Util.java:15)
       at okhttp3.internal.connection.RealConnectionPool$cleanupRunnable$1.run + 19(RealConnectionPool.java:19)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1187(ThreadPoolExecutor.java:1187)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#7. main
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 230(LockSupport.java:230)
       at java.util.concurrent.FutureTask.awaitDone + 447(FutureTask.java:447)
       at java.util.concurrent.FutureTask.get + 205(FutureTask.java:205)
       at com.crashlytics.android.core.CrashlyticsBackgroundWorker.b + 23(CrashlyticsBackgroundWorker.java:23)
       at com.crashlytics.android.core.CrashlyticsController.a + 62(CrashlyticsController.java:62)
       at com.crashlytics.android.core.CrashlyticsController$6.a + 2(CrashlyticsController.java:2)
       at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.uncaughtException + 17(CrashlyticsUncaughtExceptionHandler.java:17)
       at java.lang.ThreadGroup.uncaughtException + 1068(ThreadGroup.java:1068)
       at java.lang.ThreadGroup.uncaughtException + 1063(ThreadGroup.java:1063)
       at java.lang.Thread.dispatchUncaughtException + 1975(Thread.java:1975)

#8. Thread-15
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at ap.b + 8(ap.java:8)
       at ap.run + 40(ap.java:40)

#9. TokenRefresher
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at android.os.HandlerThread.run + 65(HandlerThread.java:65)

#10. Okio Watchdog
       at java.lang.Object.wait(Object.java)
       at com.android.okhttp.okio.AsyncTimeout.awaitTimeout + 311(AsyncTimeout.java:311)
       at com.android.okhttp.okio.AsyncTimeout.access$000 + 40(AsyncTimeout.java:40)
       at com.android.okhttp.okio.AsyncTimeout$Watchdog.run + 286(AsyncTimeout.java:286)

#11. DefaultDispatcher-worker-4
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 353(LockSupport.java:353)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.a + 13(CoroutineScheduler.java:13)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.m + 54(CoroutineScheduler.java:54)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run + 28(CoroutineScheduler.java:28)

#12. RxIoScheduler-5
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1120(ScheduledThreadPoolExecutor.java:1120)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#13. Thread-13
       at java.lang.Object.wait(Object.java)
       at android.zrhung.appeye.AppEyeUiProbe$AppEyeUIPChecker.run + 141(AppEyeUiProbe.java:141)
       at java.lang.Thread.run + 784(Thread.java:784)

#14. TubeSockWriter-4
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.LinkedBlockingQueue.take + 442(LinkedBlockingQueue.java:442)
       at com.google.firebase.database.tubesock.WebSocketWriter.writeMessage + 2(WebSocketWriter.java:2)
       at com.google.firebase.database.tubesock.WebSocketWriter.runWriter + 10(WebSocketWriter.java:10)
       at com.google.firebase.database.tubesock.WebSocketWriter.access$000(WebSocketWriter.java)
       at com.google.firebase.database.tubesock.WebSocketWriter$1.run + 2(WebSocketWriter.java:2)
       at java.lang.Thread.run + 784(Thread.java:784)

#15. Queue
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.b + 32(DependencyPriorityBlockingQueue.java:32)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.canProcess(DependencyPriorityBlockingQueue.java)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take + 2(DependencyPriorityBlockingQueue.java:2)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#16. Queue
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.b + 32(DependencyPriorityBlockingQueue.java:32)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.canProcess(DependencyPriorityBlockingQueue.java)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take + 2(DependencyPriorityBlockingQueue.java:2)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#17. Queue
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.b + 32(DependencyPriorityBlockingQueue.java:32)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.canProcess(DependencyPriorityBlockingQueue.java)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take + 2(DependencyPriorityBlockingQueue.java:2)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#18. RxSchedulerPurge-1
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 230(LockSupport.java:230)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos + 2101(AbstractQueuedSynchronizer.java:2101)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1132(ScheduledThreadPoolExecutor.java:1132)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#19. Thread-18
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at ax.a + 7(ax.java:7)
       at ax.run + 49(ax.java:49)

#20. androidmapsapi-ulcs-1
       at java.lang.Thread.sleep(Thread.java)
       at java.lang.Thread.sleep + 386(Thread.java:386)
       at java.lang.Thread.sleep + 327(Thread.java:327)
       at com.google.maps.api.android.lib6.impl.fm.run + 13(fm.java:13)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1187(ThreadPoolExecutor.java:1187)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#21. FinalizerWatchdogDaemon
       at java.lang.Thread.sleep(Thread.java)
       at java.lang.Thread.sleep + 386(Thread.java:386)
       at java.lang.Thread.sleep + 327(Thread.java:327)
       at java.lang.Daemons$FinalizerWatchdogDaemon.sleepFor + 342(Daemons.java:342)
       at java.lang.Daemons$FinalizerWatchdogDaemon.waitForFinalization + 364(Daemons.java:364)
       at java.lang.Daemons$FinalizerWatchdogDaemon.runInternal + 281(Daemons.java:281)
       at java.lang.Daemons$Daemon.run + 103(Daemons.java:103)
       at java.lang.Thread.run + 784(Thread.java:784)

#22. RxCachedWorkerPoolEvictor-1
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 230(LockSupport.java:230)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos + 2101(AbstractQueuedSynchronizer.java:2101)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1132(ScheduledThreadPoolExecutor.java:1132)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#23. androidmapsapi-vts_co.ponybikes.mercury_default
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at com.google.maps.api.android.lib6.gmm6.store.k.run + 128(k.java:128)
       at com.google.maps.api.android.lib6.gmm6.store.ab.run + 12(ab.java:12)

#24. DefaultDispatcher-worker-5
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 353(LockSupport.java:353)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.a + 13(CoroutineScheduler.java:13)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.m + 54(CoroutineScheduler.java:54)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run + 28(CoroutineScheduler.java:28)

#25. Queue
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.b + 32(DependencyPriorityBlockingQueue.java:32)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.canProcess(DependencyPriorityBlockingQueue.java)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take + 2(DependencyPriorityBlockingQueue.java:2)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#26. DefaultDispatcher-worker-6
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 353(LockSupport.java:353)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.a + 13(CoroutineScheduler.java:13)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.m + 54(CoroutineScheduler.java:54)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run + 28(CoroutineScheduler.java:28)

#27. androidmapsapi-appenvironment-1
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 230(LockSupport.java:230)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos + 2101(AbstractQueuedSynchronizer.java:2101)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1132(ScheduledThreadPoolExecutor.java:1132)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#28. androidmapsapi-ibs
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at com.google.maps.api.android.lib6.gmm6.store.p.run + 42(p.java:42)

#29. Queue
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.b + 32(DependencyPriorityBlockingQueue.java:32)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.canProcess(DependencyPriorityBlockingQueue.java)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take + 2(DependencyPriorityBlockingQueue.java:2)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#30. androidmapsapi-its
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at com.google.maps.api.android.lib6.gmm6.store.k.run + 128(k.java:128)

#31. RxCachedThreadScheduler-3
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1120(ScheduledThreadPoolExecutor.java:1120)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#32. OkHttp ConnectionPool
       at java.lang.Object.wait(Object.java)
       at com.android.okhttp.ConnectionPool$1.run + 101(ConnectionPool.java:101)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1187(ThreadPoolExecutor.java:1187)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#33. Answers Events Handler1
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 230(LockSupport.java:230)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos + 2101(AbstractQueuedSynchronizer.java:2101)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1132(ScheduledThreadPoolExecutor.java:1132)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at io.fabric.sdk.android.services.common.ExecutorUtils$1$1.a + 2(ExecutorUtils.java:2)
       at io.fabric.sdk.android.services.common.BackgroundPriorityRunnable.run + 5(BackgroundPriorityRunnable.java:5)
       at java.lang.Thread.run + 784(Thread.java:784)

#34. Thread-16
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at ax.a + 7(ax.java:7)
       at ax.run + 49(ax.java:49)

#35. androidmapsapi-vts_inaka_co.ponybikes.mercury_default
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at com.google.maps.api.android.lib6.gmm6.store.k.run + 128(k.java:128)
       at com.google.maps.api.android.lib6.gmm6.store.ab.run + 12(ab.java:12)

#36. pool-9-thread-1
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1120(ScheduledThreadPoolExecutor.java:1120)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#37. ConnectivityThread
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at android.os.HandlerThread.run + 65(HandlerThread.java:65)

#38. pool-24-thread-3
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 230(LockSupport.java:230)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos + 2101(AbstractQueuedSynchronizer.java:2101)
       at java.util.concurrent.LinkedBlockingQueue.poll + 467(LinkedBlockingQueue.java:467)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1091(ThreadPoolExecutor.java:1091)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#39. Thread-17
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at ax.a + 7(ax.java:7)
       at ax.run + 49(ax.java:49)

#40. GoogleApiHandler
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at android.os.HandlerThread.run + 65(HandlerThread.java:65)

#41. GLThread 8834
       at java.lang.Object.wait(Object.java)
       at com.google.maps.api.android.lib6.gmm6.vector.bf.run + 58(bf.java:58)

#42. RxComputationThreadPool-2
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 230(LockSupport.java:230)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos + 2101(AbstractQueuedSynchronizer.java:2101)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1132(ScheduledThreadPoolExecutor.java:1132)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#43. ReferenceQueueDaemon
       at java.lang.Object.wait(Object.java)
       at java.lang.Daemons$ReferenceQueueDaemon.runInternal + 178(Daemons.java:178)
       at java.lang.Daemons$Daemon.run + 103(Daemons.java:103)
       at java.lang.Thread.run + 784(Thread.java:784)

#44. Thread-19
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at ax.a + 7(ax.java:7)
       at ax.run + 49(ax.java:49)

#45. DefaultDispatcher-worker-3
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 353(LockSupport.java:353)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.a + 13(CoroutineScheduler.java:13)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.m + 54(CoroutineScheduler.java:54)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run + 28(CoroutineScheduler.java:28)

#46. Queue
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.b + 32(DependencyPriorityBlockingQueue.java:32)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.canProcess(DependencyPriorityBlockingQueue.java)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take + 2(DependencyPriorityBlockingQueue.java:2)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#47. RxCachedThreadScheduler-2
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1120(ScheduledThreadPoolExecutor.java:1120)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#48. Queue
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.b + 32(DependencyPriorityBlockingQueue.java:32)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.canProcess(DependencyPriorityBlockingQueue.java)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take + 2(DependencyPriorityBlockingQueue.java:2)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#49. FinalizerDaemon
       at java.lang.Object.wait(Object.java)
       at java.lang.Object.wait + 422(Object.java:422)
       at java.lang.ref.ReferenceQueue.remove + 188(ReferenceQueue.java:188)
       at java.lang.ref.ReferenceQueue.remove + 209(ReferenceQueue.java:209)
       at java.lang.Daemons$FinalizerDaemon.runInternal + 232(Daemons.java:232)
       at java.lang.Daemons$Daemon.run + 103(Daemons.java:103)
       at java.lang.Thread.run + 784(Thread.java:784)

#50. androidmapsapi-scpm-1
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 230(LockSupport.java:230)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos + 2101(AbstractQueuedSynchronizer.java:2101)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1132(ScheduledThreadPoolExecutor.java:1132)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#51. FirebaseDatabaseWorker
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 230(LockSupport.java:230)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos + 2101(AbstractQueuedSynchronizer.java:2101)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1132(ScheduledThreadPoolExecutor.java:1132)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#52. DefaultDispatcher-worker-8
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 353(LockSupport.java:353)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.a + 13(CoroutineScheduler.java:13)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.m + 54(CoroutineScheduler.java:54)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run + 28(CoroutineScheduler.java:28)

#53. queued-work-looper
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at android.os.HandlerThread.run + 65(HandlerThread.java:65)

#54. DefaultDispatcher-worker-1
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 353(LockSupport.java:353)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.a + 13(CoroutineScheduler.java:13)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.m + 54(CoroutineScheduler.java:54)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run + 28(CoroutineScheduler.java:28)

#55. GoogleApiHandler
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at android.os.HandlerThread.run + 65(HandlerThread.java:65)

#56. Queue
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.b + 32(DependencyPriorityBlockingQueue.java:32)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.canProcess(DependencyPriorityBlockingQueue.java)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take + 2(DependencyPriorityBlockingQueue.java:2)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#57. pool-11-thread-1
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1120(ScheduledThreadPoolExecutor.java:1120)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#58. RxIoScheduler-4
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1120(ScheduledThreadPoolExecutor.java:1120)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#59. androidmapsapi-vts_labl_co.ponybikes.mercury_default
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at com.google.maps.api.android.lib6.gmm6.store.k.run + 128(k.java:128)
       at com.google.maps.api.android.lib6.gmm6.store.ab.run + 12(ab.java:12)

#60. RxCachedThreadScheduler-8
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1120(ScheduledThreadPoolExecutor.java:1120)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#61. androidmapsapi-vts_traf_co.ponybikes.mercury_default
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at com.google.maps.api.android.lib6.gmm6.store.k.run + 128(k.java:128)
       at com.google.maps.api.android.lib6.gmm6.store.ab.run + 12(ab.java:12)

#62. RxCachedThreadScheduler-7
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1120(ScheduledThreadPoolExecutor.java:1120)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#63. Queue
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.PriorityBlockingQueue.take + 548(PriorityBlockingQueue.java:548)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.b + 32(DependencyPriorityBlockingQueue.java:32)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.canProcess(DependencyPriorityBlockingQueue.java)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take + 2(DependencyPriorityBlockingQueue.java:2)
       at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#64. androidmapsapi-vts_co.ponybikes.mercury_7376ebfff5317774
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at com.google.maps.api.android.lib6.gmm6.store.k.run + 128(k.java:128)
       at com.google.maps.api.android.lib6.gmm6.store.ab.run + 12(ab.java:12)

#65. TubeSockReader-4
       at com.android.org.conscrypt.NativeCrypto.SSL_read(NativeCrypto.java)
       at com.android.org.conscrypt.NativeSsl.read + 399(NativeSsl.java:399)
       at com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read + 546(ConscryptFileDescriptorSocket.java:546)
       at java.io.DataInputStream.readFully + 198(DataInputStream.java:198)
       at com.google.firebase.database.tubesock.WebSocketReceiver.read + 2(WebSocketReceiver.java:2)
       at com.google.firebase.database.tubesock.WebSocketReceiver.run + 16(WebSocketReceiver.java:16)
       at com.google.firebase.database.tubesock.WebSocket.runReader + 269(WebSocket.java:269)
       at com.google.firebase.database.tubesock.WebSocket.access$000(WebSocket.java)
       at com.google.firebase.database.tubesock.WebSocket$2.run + 2(WebSocket.java:2)
       at java.lang.Thread.run + 784(Thread.java:784)

#66. DefaultDispatcher-worker-7
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 353(LockSupport.java:353)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.a + 13(CoroutineScheduler.java:13)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.m + 54(CoroutineScheduler.java:54)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run + 28(CoroutineScheduler.java:28)

#67. androidmapsapi-vts_no_pois_co.ponybikes.mercury_default
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next + 386(MessageQueue.java:386)
       at android.os.Looper.loop + 175(Looper.java:175)
       at com.google.maps.api.android.lib6.gmm6.store.k.run + 128(k.java:128)
       at com.google.maps.api.android.lib6.gmm6.store.ab.run + 12(ab.java:12)

#68. RxCachedThreadScheduler-4
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.park + 190(LockSupport.java:190)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await + 2059(AbstractQueuedSynchronizer.java:2059)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1120(ScheduledThreadPoolExecutor.java:1120)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#69. DefaultDispatcher-worker-2
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 353(LockSupport.java:353)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.a + 13(CoroutineScheduler.java:13)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.m + 54(CoroutineScheduler.java:54)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run + 28(CoroutineScheduler.java:28)

#70. androidmapsapi-ula-2
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 230(LockSupport.java:230)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos + 2101(AbstractQueuedSynchronizer.java:2101)
       at java.util.concurrent.LinkedBlockingQueue.poll + 467(LinkedBlockingQueue.java:467)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1091(ThreadPoolExecutor.java:1091)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

#71. Measurement Worker
       at java.lang.Object.wait(Object.java)
       at java.lang.Object.wait + 422(Object.java:422)
       at com.google.android.gms.measurement.internal.zzfg.run + 76(zzfg.java:76)

#72. RxIoScheduler-1 (Evictor)
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$ + 2163(Thread.java:2163)
       at sun.misc.Unsafe.park + 358(Unsafe.java:358)
       at java.util.concurrent.locks.LockSupport.parkNanos + 230(LockSupport.java:230)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos + 2101(AbstractQueuedSynchronizer.java:2101)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 1132(ScheduledThreadPoolExecutor.java:1132)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take + 849(ScheduledThreadPoolExecutor.java:849)
       at java.util.concurrent.ThreadPoolExecutor.getTask + 1092(ThreadPoolExecutor.java:1092)
       at java.util.concurrent.ThreadPoolExecutor.processTask + 1172(ThreadPoolExecutor.java:1172)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1152(ThreadPoolExecutor.java:1152)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run + 784(Thread.java:784)

Concerning your first point about seeing the whole code, what do you need ? The activity extends ScopedActivity, launch a coroutine with a flow collection in it. The flow observe the firebase user auth status combine with the observation of a firebase node with the lib I made FlowFirebase.

Concerning your second point about using a private scope property, I do not see the gain, It will work exactly the same and will be cancelled in the onDestroy method but I will have to write scope.launch instead of launch. Why is it better to do it like that ? :)

@tperraut
Copy link
Author

tperraut commented Nov 16, 2019

So it seems that is was related to #1177 and big thanks to @nickallendev for the collectWhileActive extension idea in #1265 !

/**
 * Terminal flow operator that collects the given flow with a provided [action] only if the parent [coroutineContext]
 * is active
 */
suspend inline fun <T> Flow<T>.collectWhileActive(crossinline action: suspend (value: T) -> Unit): Unit =
    collect { value ->
        if (coroutineContext.isActive) {
            action(value)
        }
    }

/**
 * Terminal flow operator that [launches][launch] the [collection][collect] of the given flow in the [scope] only if
 * the parent [coroutineContext] is active
 * It is a shorthand for `scope.launch { flow.collectWhileActive {} }`.
 */
fun <T> Flow<T>.launchInWhileActive(scope: CoroutineScope) = scope.launch {
    this@launchInWhileActive.collectWhileActive { /* Do nothing */ }
}

@zach-klippenstein
Copy link
Contributor

Concerning your second point about using a private scope property, I do not see the gain, It will work exactly the same and will be cancelled in the onDestroy method but I will have to write scope.launch instead of launch. Why is it better to do it like that ? :)

Making your class implement CoroutineScope is saying that CoroutineScope is part of your class's API, which it isn't – the fact that your class defines a coroutine scope is a private implementation detail.

@tperraut
Copy link
Author

@zach-klippenstein thank you I already did what you said and implement a custom scope that also extend lifecycleObserver to cancel the scope in onStop or onDestroy automatically.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants