【发布时间】:2016-11-04 13:38:22
【问题描述】:
我看到很多关于从异步任务中获取结果的问题,但没有一个能解决我的问题。我想做的事情是从 MyClass 对象的异步任务数组中获取并在 UI 中使用它们,但是在不同的情况下我有不同的 UI。有时我用我的数组填充 recyclerview,有时我用我的数组填充无尽的选项卡式活动。这意味着我不能将我的 UI 元素传递给异步任务以便在onPostExecute() 中处理它。我想从 Async 任务中得到的结果正是 MyClass 对象的数组,然后在不同的情况下以不同的方式使用它。还有一件重要的事情是,我应该只在 AsyncTask 执行后填充我的 UI(因为如果它仍在执行,我没有数据可以填充 UI),所以我不能简单地写类似
MyClass[] result = new MyAsyncTask().execute().getResult()
MyUI.fillWith(result)
因为我很可能会得到 NPE。
那么我怎样才能将我的结果作为 MyClass 对象的数组取回并仅在我得到结果后用它填充我的 UI(所以在 UI 线程中我应该得到我的 asynctask 完成所有工作的信息,只有在那之后我才能用我的数据填充 UI。当然我不想阻塞我的 UI 线程)?
由于我之前写的原因,在onPostExecute() 中处理 UI 并不能解决我的问题。用接口覆盖 AsyncTask 似乎也不是我需要的东西。我看到了带有 AsyncTask 唯一令牌的解决方案,但我不明白它是如何工作的。
【问题讨论】:
-
但是您必须在 onPostExecute 中处理 UI 线程,因为它就是这样工作的。不过,也许您不应该使用 AsyncTask。您是否考虑过其他网络库?
-
那个top answer本质上就是你要的,只要把响应界面中的
String output换成MyClass[] output,就应该设置好了 -
@cricket_007 是的,这正是我所需要的,谢谢。但这似乎是复杂的解决方案。这很奇怪,因为据我了解这是一个常见问题。
-
这并不复杂,约瑟夫的回答解决了它。
-
很复杂,但并不复杂。 Volley、OkHttp、Retrofit、RxJava 等异步库都对接口回调做了完全相同的事情。
标签: java android multithreading android-asynctask