如何在 Android 中使用协程在按下后退按钮时进行 API 调用而不取消?

问题描述 投票:0回答:1

我想实现以下功能:在 Activity 中按后退按钮会触发 API 调用,同时应用程序会导航回上一个 Activity,而无需等待 API 响应。但是,我想确保 API 调用不会被取消。

如何使用协程实现此目的?有办法做到这一点吗?

目前,我正在使用 viewModelScope 进行 API 调用,但由于 ViewModel 生命周期结束,我面临着 API 被取消的问题。

android viewmodel lifecycle
1个回答
0
投票
override fun onBackPressed() {
    // Call your API using a GlobalScope or custom CoroutineScope
    GlobalScope.launch(Dispatchers.IO) {
        try {
            // Make your API call here
            val response = apiService.makeApiCall()

            // Handle the response if necessary
            // Example: save data to the database or log the result
        } catch (e: Exception) {
            // Handle any exceptions here
            e.printStackTrace()
        }
    }

    // Navigate back to the previous activity
    super.onBackPressed() // This will close the current activity
}

GlobalScope:这个协程作用域与应用程序一样存在。当 ViewModel 或 Activity 被销毁时,它不会被取消,这意味着即使您导航回来,API 调用也会继续。

Dispatchers.IO:用于在后台线程中执行 API 调用,以避免阻塞主线程。

super.onBackPressed():此行确保活动完成并在启动协程后立即导航到上一个屏幕。

注意事项

GlobalScope 应谨慎使用,因为它不依赖于任何生命周期,如果使用不当,可能会导致内存泄漏。如果您使用它,请确保 API 调用不会花费太长时间,并且正确处理异常。

替代方案:如果您希望对协程生命周期有更多控制,您可以使用 Job 创建自定义 CoroutineScope 并手动管理其生命周期。

private val job = Job()
private val customScope = CoroutineScope(Dispatchers.IO + job)

override fun onBackPressed() {
    customScope.launch {
        try {
            val response = apiService.makeApiCall()
            // Handle the response if necessary
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    super.onBackPressed()
}

override fun onDestroy() {
    super.onDestroy()
    job.cancel() // Cancel the job to avoid memory leaks
}

在此替代方案中,您可以在 onDestroy 中取消自定义 CoroutineScope,以避免任何潜在的内存泄漏,但 API 调用不会与 ViewModel 的生命周期相关联。

© www.soinside.com 2019 - 2024. All rights reserved.