【问题标题】:Kotlin how to launch an async processing from android.app.ApplicationKotlin 如何从 android.app.Application 启动异步处理
【发布时间】:2021-04-09 16:04:09
【问题描述】:

我是 Kotlin 的新手,正在尝试在 android.app.Application

中启动异步后端调用
import android.app.Application;

class App: Application {

  override fun onCreate() {
    super.onCreate()
    fetchDataFromBackend()
  }

  fun fetchDataFromBackend() {
    lifecycleScope.launch {
      // Fetches data from backed.
    }
  }
}

问题是 lifecycleScope.launch 不能从应用程序中使用,我在 Activity/Fragments 和 viewModelScope 中为我的 viewModel 做了同样的事情。

我希望在应用程序中做同样的事情,有人有什么建议吗?

【问题讨论】:

  • 为了更好地理解,请问您的方案是什么,从App 类中的后端获取数据?为什么 Activity 或 Fragment 不适合您?
  • 它用于获取整个应用生命周期所需的用户偏好,不限于任何活动。
  • 我明白了,谢谢。 App 类的问题在于它没有像 Activity 这样的适当生命周期。因此,如果您需要,您无法像在 Activity 中那样正确取消您的请求。您是否考虑过单一活动方法,您是否可以这样做?老实说,我不知道您的方案的最佳实践是什么。我通常避免在App 类中做任何复杂的逻辑。

标签: android kotlin kotlin-coroutines kotlin-android-extensions android-ktx


【解决方案1】:

您可以使用ProcessLifecycleOwner,它与Application 对象具有相同的生命周期。

ProcessLifecycleOwner.get().lifecycleScope.launch {
  // Fetches data from backend
}

【讨论】:

  • 如果我错了,请纠正我,但不能保证在您的应用发送到后台后很快就会调用它。所以它不适合清理不再需要的任务和内存。
  • 你是对的。在这个范围内运行就像在 Thread 或 AsyncTask 中运行——它不会让你的进程保持活动状态,所以如果没有其他服务或活动正在运行,操作系统可能会杀死你的应用程序进程。 OP提到它是为了获取用户偏好,所以我假设如果没有其他组件在运行,那么获取操作没有意义,所以在这个协程中间杀死应用程序是可以的。
猜你喜欢
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多