【问题标题】:What do you use for long running tasks since Loaders and AsyncTask have been deprecated?由于 Loaders 和 AsyncTask 已被弃用,您将什么用于长时间运行的任务?
【发布时间】:2020-10-26 11:55:57
【问题描述】:

LoadersAsyncTask 是非常易于使用且对执行网络 http 请求等长时间运行的操作很有帮助的类,但由于它们已被弃用,我找不到替代方案。我知道我可以使用谷歌建议的LiveData + ViewModel,但他们没有在单独的线程中执行任务,那么除了它们我们还能使用什么? RxJava?还是别的什么? (不管手动创建ThreadsExecutors

*我使用 Java。

【问题讨论】:

  • 你可以使用协程
  • Java 有什么用??
  • 如果你需要使用流,你可以使用 Rx 或 Flow(协程流),否则你可以使用协程。仅使用 Rx 来更改线程是不必要的。
  • @ManuelMato 使用流是什么意思,好吗?例如,使用Java,如果我想做http请求并获得响应,我应该使用RxJava而不是AsyncTasks并与ViewModel结合吗?
  • 数据流就是数据流,发出它们,你需要消费它们,例如蓝牙数据。如果你想从 api 获取数据,你可以使用使用挂起函数的协程(引擎盖下是回调),如果你愿意,可以在 viewmodel 中使用 livedata 来更新 ui。因此 ViewModel 使用 IO 调度程序启动协程,然后您可以使用 postValue 方法更新实时数据。协程比 Rx 更容易,而且我认为代码比 Rx 更清晰。您可以在 proandroiddev shorturl.at/coT02 中使用协程阅读并查看我的基础项目

标签: android multithreading android-asynctask background-process asynctaskloader


【解决方案1】:

为了执行网络请求,您正在使用的网络库应该处理它。所有网络 SDK(Okhttp、Retrofit)都处理后台处理,您不必担心。

对于其他后台进程,或者如果您使用自己的代码进行 HTTP 调用(如 HttpUrlConnection 等),您有几个选择。

  1. 协程。如果您的项目使用 Java,那将不是问题,因为 Java 和 Kotlin 是可互操作的。

  2. ExecutorService:提供一堆有用的 API 将任务推送到后台,然后您可以使用 MainThread Looper 将数据从后台线程发送回 UI。

  3. 处理线程和 Intent 服务:它们是标准的 Android API,仅用于后台处理。

参考:https://developer.android.com/guide/background

【讨论】:

  • 非常感谢。还有一件事,RxJava 可以成为其中一种选择吗?我真的不知道
  • 是的,但是我没有用过 RxJava。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2013-02-25
相关资源
最近更新 更多