Android中的异步任务不使用AsyncTask
Posted
技术标签:
【中文标题】Android中的异步任务不使用AsyncTask【英文标题】:Asynchronous task in Android withou using AsyncTask 【发布时间】:2019-05-17 18:58:51 【问题描述】:大家!
我正在为我工作的公司构建一个应用程序,我们必须在后台运行与 API 的交互,但是在此交互运行时,交互会向我们发送一些消息,这些消息必须启用/禁用某些视图活动/片段。
我们正在使用异步任务运行此交互,但问题是:当消息来自后台线程时,我无法更新视图属性。我必须使用自定义 Progress 类来处理这些消息,然后更改视图属性。
在我们的应用程序中,我们使用 MVVP 模式,我的异步任务是从一个 ViewModel 调用的,它负责执行业务逻辑。
但我真正想知道的是:是否有另一种方法可以在不使用 AsyncTask 子类的情况下执行异步任务?也许你们中的一些人可以阻止我推荐一种使用回调来通知消息以及函数何时结束的方法。
我知道 Retrofit 使用 enqueue 方法进行异步任务,但我不明白如何自己实现。
Ps.:AsyncTask 子类工作正常,但我没有与那个实现相处。
【问题讨论】:
您有一些选项,例如Executers
或 Coroutines
(Kotlin) ..
你确定你不是指 mvvm (model-view-viewmodel) 模式,因为你使用了视图模型?
我不喜欢有人对问题投了反对票但没有解释原因...不是我。无论如何,您的问题不是很好,因为您假设“当消息来自后台线程时,我无法更新视图属性。”正如阿列克谢在回答中指出的那样,这是错误的。见meta.stackexchange.com/questions/66377/what-is-the-xy-problem
【参考方案1】:
当消息来自后台线程时,为什么不能更新视图属性?可以在many ways完成。
无论如何,没有其他出路,因为 I/O 操作不能在 GUI 线程上执行,只能在某些后台线程上执行。
【讨论】:
【参考方案2】:您可以查看像 retrofit 这样的库来执行 API 调用。 此外,如果您使用的是 kotlin,您可以查看 coroutines 以获得更通用的异步工作。
【讨论】:
我打算使用协程,但我不明白它是如何工作的。昨天我开始学习更多关于协程的知识,也许我可以使用 MutableLiveData#post() 方法。我认为它可以使用 AsyncTask 子类来工作。以上是关于Android中的异步任务不使用AsyncTask的主要内容,如果未能解决你的问题,请参考以下文章
Android中使用Thread线程与AsyncTask异步任务的区别