【问题标题】:How to update the UI after an asynchronous task in an extra class has finished using Kotlin?如何在额外类中的异步任务使用 Kotlin 完成后更新 UI?
【发布时间】:2018-03-20 14:29:14
【问题描述】:

喂!

我想知道在 Volley 请求完成并调用 onResponse 处理程序后,使用 Kotlin 更新 Android 应用程序的 UI 的最佳做法是什么。我想解决问题的方式给了我一些困难,所以也许我有错误的方法......

我来自同步世界,因此我的方法是这样的:创建一个获取数据并返回获取数据的类。函数返回数据后,更新 UI。

然而,我们生活在一个异步的世界中,因此方法必须不同。

我仍然希望在额外的类中获取数据。如this tutorial 所示,在主类中获取数据并从 onResponse 事件监听器中更新 UI 很简单,但不是最佳实践,对吧?数据获取类不应包含对 UI 的任何引用,因为它应该是可重用的。

如何以简单但有效且可重复使用的方式完成?请举例说明。可以用 async/await 之类的东西来完成吗?可以用钩子或事件侦听器之类的东西来完成吗(我在想socket.io)。 Adapter.notifyDataSetChanged() 可以帮忙吗?

我一直在寻找这个主题几个小时,但我找不到任何有用的东西。所以要么我找错了地方,要么答案很明显,以前没有人问过。到目前为止,我找到的一些答案非常具体,或者包含太多额外的代码,我觉得它没有用。

由于许多应用程序都在做我想要实现的目标,这一定是一件容易的事。任何从互联网获取数据的应用程序都需要我所要求的。所以我一定是错过了什么。

谢谢!

【问题讨论】:

  • 使用onResponse 是简单更新的最佳实践。如果您不想直接更新 UI,请使用 MVP 或 MVVM 并在 onRespone 回调中更新您的模型。回调在 UI 线程上执行。如果您想要更“详细”的方式,请查看LiveData
  • 但是使用 onResponse 进行 UI 更新会迫使我在主类中包含数据获取功能,这会带走很多可重用性。
  • 如果你想要简单,就这样做吧。如果你想要它nice,你必须学习如何正确使用像 MVVM 这样的模式。已经有很多资源(包括 SO)解释了这些模式。如果您有更多问题,您应该提出一个新的(特定)问题,而不是编辑这个问题。

标签: android kotlin android-volley


【解决方案1】:

第一部分:

由于许多应用程序都在做我想要实现的目标,这一定是一件容易的事。任何从互联网获取数据的应用程序都需要我所要求的。所以我一定是错过了什么。

使用onResponse 是简单更新的最佳做法。回调在 UI 线程上执行。这对于小型应用程序和瞬态数据来说已经足够了。 这是最简单的方法。

第二部分

如何使用单独的类:它已经使用了单独的类。 StringRequest 是一个匿名内部类。

第三部分

如何以一种简单但有效且可重复使用的方式完成?

如果您不想直接更新 UI,请使用 MVP 或 MVVM 等模式并在 onRespone 回调中更新您的模型。

您可以在框架提供的架构组件中找到这方面的指导。您正在寻找的是LiveDataViewModel。 有关教程,请查看Guide。对于这样一个笼统的回答,我很抱歉,但关键字和链接应该涵盖您非常笼统的问题,并为您的研究提供方向。

第四部分

请举例说明。

没有。所以不是这个地方。在internet 上查找教程或购买有关设计模式的book,如果您有具体问题,请返回。这个问题太笼统了,这里就不回答了。另外,如果您想要代码,请分享您已经尝试过的内容。 SO 不是“我的代码”网站,尽管它有时看起来像。所以看看示例中的代码,并尝试复现。

【讨论】:

  • 感谢您的回答!无需辩解!正如我之前所说:第一部分并没有解决我的困境,因为它告诉我将 UI 更新和数据获取混为一谈。此外,它并没有真正告诉我如何使用单独的类来获取数据。第二部分确实很笼统,​​但它指出了一些有趣的方向。让我着迷的是,如此常见的事情解决得如此复杂......
  • 它已经使用了一个单独的类来获取数据。此外,如果您阅读架构组件中的指南,您应该会清楚如何使用 View、Model 和 ViewModel。
  • 我看到您提供的示例代码不遵循 MVVM 之类的模式。有关如何完成 MVVM 的简单示例,请查看:github.com/erikcaffrey/People-MVVM/tree/master/app/src/main/…(不使用架构组件,但原则上更容易理解它是如何工作的)
  • 感谢您提供指向 repo 和教程的链接!我一定会看看的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多