为了活动小家电-GlobalScope使用(一)

93 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的10天,点击查看活动详情

作为单个对象运行的 GlobalScope

GlobalScope 的内部代码如下所示。

在 Kotlin 中,一个对象对应于 Java 中的一个单例。这个对象是一个安全的单例,因为它是在内存中增加时立即创建的。

public object GlobalScope : CoroutineScope {
    /**
     * Returns [EmptyCoroutineContext].
     */
    override val coroutineContext: CoroutineContext
        get() = EmptyCoroutineContext
}

它也被记录在案,但解释如下。

它是一个在顶层运行的协程,在应用程序的生命周期中运行,并且无论每个屏幕都终止。 全局作用域用于启动在整个应用程序生命周期内运行且不会过早取消的顶级协程。全局范围的另一个用途是在 Dispatchers.Unconfined 中运行的运算符,它们没有任何与之关联的作业。

让我们创建一个 GlobalScope 示例。

总之,在 Android 开发环境中遵循生命周期是很自然的。最后,我们要保证内存可以很好的释放,cancel也可以,首先写下下面的代码,尝试操作一下。

fun loadGlobal() = GlobalScope.launch {
    Log.d("TAG", "Thread ${Thread.currentThread()}")
    count++

    // 500 毫秒后调用 updateView 与外部启动分开
    GlobalScope.launch {
        delay(500)
        withContext(Dispatchers.Main) {
            updateView("计数: $count  ${Thread.currentThread()}")
        }
    }

    //  5 秒后打印计数的代码。
    delay(5000)
    launch(Dispatchers.Main) {
        updateView("计数: $count  ${Thread.currentThread()}")
    }
}

这段代码在当前可见的屏幕上运行没有问题。

让我们先得到错误

Exception让我们在 GlobalScope 的启动和生成中运行的代码延迟 5 秒。

fun loadGlobal() = GlobalScope.launch {
   

    GlobalScope.launch {
        ...
    }

    delay(5000)

    // 添加Exception
    throw Exception("异常Exception")

    launch(Dispatchers.Main) {
        ...
    }
}

当然,5秒后,Error!!!!公开消息并处理终止。

让我们解决问题。

问题是

  • 5秒后出现异常,影响整体运行。

为了不影响 CoroutineScope 的启动行为与其他子项的启动不同,可以添加两个代码。

通过添加以下内容,无论异常情况如何,它都可以运行。

fun loadGlobal() = GlobalScope.launch(exception + SupervisorJob()) {
    
    GlobalScope.launch {
        ...
    }
    throw Exception("异常Exception")
    
}

private val exception = CoroutineExceptionHandler { coroutineContext, throwable ->
  // 这里的异常处理
}

为了活动小家电,下篇继续搞!