0

Android 中异步操作的顺序执行至少是复杂的。以前像 in 这样的两个运算符之间的分号顺序执行do_this(); do_that()现在需要链接侦听器,这很丑陋且几乎不可读。

奇怪的是,证明需要链接顺序操作的示例通常看起来很做作,但今天我找到了一个完全合理的示例。

在 Android 中有应用内计费,一个应用程序可以支持多个所谓的应用内产品(也称为 SKU = 库存单位),例如让用户只购买(支付)他/她需要(而且,唉,还让大胡子男人向青少年出售位图)。

检索应用内产品信息的功能是

public void queryInventoryAsync(final boolean querySkuDetails,
                                final List<String> moreSkus,
                                final QueryInventoryFinishedListener listener)

它有一个限制,列表必须最多包含 20 个项目。(是的。) 即使这 20 种产品中只有少数被注册为应用内产品。

我想检索,比如说,关于一百个应用内产品的信息。第一个想法是循环调用此函数,但任何时候都只允许与市场进行一次异步操作。

当然有人可能会说“不要重用,更改源”,甚至为此提供非常好的论据,这可能是我最终会做的,但我写这篇文章是因为我想看到一个优雅的重用解决方案。

在一般情况下,是否有一种优雅(=不麻烦)的模式或技巧可以链接多个异步操作?

(我强调使用监听器的异步操作是预先存在的代码。)

UPD 这就是 JavaScript 世界中所谓的“回调地狱”(http://callbackhell.com/)。

4

3 回答 3

0

Handler对于任何线程上的顺序工作都很有用,而不仅仅是在 UI 线程上。

查看HandlerThread,根据其 Looper 创建一个 Handler,并将后台工作发布到该处理程序。

于 2013-11-12T18:57:34.877 回答
0

您可以通过在前一个的方法中AsyncTask调用execute()下一个AsyncTask的方法来一个接一个地对 s 进行排序。onPostExecute()

于 2013-11-12T13:09:06.443 回答
0

看起来ReactiveX 就是这样承诺的

http://blog.danlew.net/2014/09/22/grokking-rxjava-part-2/

query("Hello, world!") // Returns a List of website URLs based on a text search
    .flatMap(urls -> Observable.from(urls))
    .flatMap(url -> getTitle(url)) // long operation
    .filter(title -> title != null)
    .subscribe(title -> System.out.println(title));

Android 版 ReactiveX: https ://github.com/ReactiveX/RxAndroid

Retrolambda:https ://github.com/orfjackal/retrolambda (Java 5、6、7 的 Lambda)

于 2016-02-23T15:38:00.497 回答