在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世界中。
答案 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)