例外:无法启动异步操作(刷新库存),因为另一个异步操作(launchPurchaseFlow)正在进行中

Tim*_*Sim 4 android in-app-purchase

是的,这个问题有两个常见的答案:

一:billingHelper.flagEndAsync();在开始异步操作之前调用一个hack .这通常被认为是不推荐的,并且在许多情况下不能解决问题.

二:handleActivityResult在Activity中调用IabHelper的方法onActivityResult.这个解决方案的问题(除了我不理解这个方法的目的)是在我的应用程序中,应用程序内的计费操作在应用程序的Application类中完成,因为应用程序中有一堆活动,用户可能会触发应用内购买以及应用需要查询应用内购买广告资源的多个可能的入口点.所以我试着把:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (!MyApplication.myAppInstance.mHelper.handleActivityResult(requestCode, resultCode, data))    
    super.onActivityResult(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)

进入用户可能开始购买的每个活动,但这并没有解决崩溃问题.我真的不明白这个onActivityResult的目的,所以我可能误解了它应该如何实现.为什么Google要强迫我从活动中进行应用内结算操作?

Ale*_*ood 11

我遇到了类似的问题.不幸的是,IabHelper代码并不是很好......它主要是好的,但是线程模型有点混乱,这意味着如何正确处理边缘情况会让人感到困惑.

摆脱崩溃的简单方法是使用if语句检查简单地包装方法调用,如:

if (!mHelper.isAsyncInProgress()) {
    mHelper.launchPurchaseFlow(...);
}
Run Code Online (Sandbox Code Playgroud)

一个更好的解决方案是IabHelper从头开始重写代码......但在这种特殊情况下,异常很少发生,它可能不值得.不幸的是,在这种情况下没有一个简单的解决方案...... IabHelper示例代码并不是最好的,我们大多数人都会决定使用它.

  • @FireZenk Alex遗漏了他的实现,但由于IabHelper有一个成员变量,所以你需要做的就是编辑IabHelper.java并添加:public boolean isAsyncInProgress(){return mAsyncInProgress; } (4认同)