在Android中顺序执行异步操作

时间:2013-11-12 12:41:29

标签: java android

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

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

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

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

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

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

我想检索一百个应用内商品的信息。第一个想法是在循环中调用此函数,但是随时只允许与市场进行一次异步操作。

当然可以说&#34;不要重复使用,改变来源&#34;,甚至为此提供非常好的论据,这可能是我最终会做的,但我写这个是因为我想看到优雅的重用解决方案。

在一般情况下是否存在允许链接多个异步操作的优雅(=非繁琐)模式或技巧?

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

UPD这就是所谓的&#34;回调地狱&#34; (http://callbackhell.com/)在JavaScript世界中。

3 个答案:

答案 0 :(得分:0)

您可以通过调用前一个AsyncTask方法中下一个execute()的{​​{1}}方法,依次对AsyncTask进行排序。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

看起来像ReactiveX promises exactly this

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(Lambdas for Java 5,6,7)