发现这里发生了什么,这不是我想的那样。我会在这里详细介绍它,因为它可能对某人有用。与其他 AsyncTask 线程和线程池无关。
IabHelper 类中有两个函数 flagStartAsync() 和 flagEndAsync()。这样做的目的是产生一个单通道门(有点像传统多线程中的 wait() 和 signal()),因此一次只能发生一个异步操作(即与 Google Play 和服务器的通信)。如果 flagStartAsync() 在某些事情已经发生时被调用,它会产生一个异常。不是非常优雅,但我猜是有效的。
flagStartAsync() 'test and set' 在 launchPurchaseFlow() 开始时被调用,而 flagEndAsync 在 handleActivityResult() 中被调用 - 再次 - 在其他地方。因此,提供购买流程总是会产生结果,没问题。问题是——并非总是如此。
如果您查看 launchPurchaseFlow() ,则有几条路径不会启动异步操作,如果其中一条被采用,则 mAsyncInProgress (相关标志)将保持设置。
在我的案例中,让我感到震惊的是,我没有检查过该物品是否已经购买,而“已经购买”是出路之一。过失,但问题是我无法说服自己,没有其他几条路是你有时无法避免的。例如,如果操作缓慢并且“购买”按钮被按下两次怎么办?我敢打赌还有其他人。可以捕获异常,这将停止崩溃,但如果最终没有任何东西清除标志,这将无济于事。我猜异常处理程序可以调用 flagEndAsync() 但它有一种不舒服的“大锤敲碎坚果”的感觉。
令我震惊的是,这可能是一段不健壮的代码。我现在所做的是在launchPurchaseFlow() 之外以各种方式调用flagEndAsync(),但这只是一个临时修复。我对 IabHelper 代码了解得不够多,但我认为它需要更仔细的思考,我需要对其进行分析以了解它所做的一切。