我根据Android的Implementing In-app Billing指南实现了应用内结算(v3)。

一切正常,直到我旋转设备,然后立即将其旋转回其原始方向。实际上,有时它可以工作,有时它会因以下原因而崩溃:
java.lang.IllegalStateException: IabHelper was disposed of, so it cannot be used.
似乎这与IAB的异步特性有关,尽管我不是很肯定。

有什么想法吗?

最佳答案

您可能会遇到异常,因为在 Activity 生命周期的某个地方,您调用了mHelper.dispose(),然后稍后尝试使用相同的已处置实例。我的建议是只在onDestroy()中处置mHelper,然后在onCreate()中重新创建它。

但是,您将遇到IabHelper和设备旋转的另一个问题。问题是这样的:在 Activity 的onCreate()中,创建IabHelper实例mHelper并进行设置。稍后,您调用mHelper.launchPurchaseFlow(...),IAB弹出对话框将浮空显示在您的 Activity 上方。然后旋转设备,然后将IabHelper实例放入onDestroy(...)中处置,然后在onCreate(...)中重新创建。 IAB对话框仍然显示,您按购买按钮,购买完成。然后在您的 Activity 中调用onActivityResult(),您自然会调用mHelper.handleActivityResult(...)。问题是,从未在重新创建的IabHelper实例上调用launchPurchaseFlow(...)。如果先前已在当前实例上调用handleActivityResult(...),则IabHelper仅在launchPurchaseFlow(...)中处理 Activity 结果。您的OnIabPurchaseFinishedListener将永远不会被调用。

我对此的解决方案是修改IabHelper以允许您告诉它期望handleActivityResult(...)而不调用launchPurchaseFlow(...)。我添加了以下内容
IabHelper.java

public void expectPurchaseFinished(int requestCode, OnIabPurchaseFinishedListener listener)
{
    mRequestCode = requestCode;
    mPurchaseListener = listener;
}

这将导致IabHelper在调用onIabPurchaseFinished(...)时在监听器上调用handleActivityResult(...)。然后,您执行以下操作:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    mHelper.expectPurchaseFinished(requestCode, mPurchaseFinishedListener);
    mHelper.handleActivityResult(requestCode, resultCode, data);
}

我的IabHelper的整个副本可以在https://gist.github.com/benhirashima/7917645中找到。请注意,我已使用this commit中找到的版本更新了IabHelper的副本,该版本修复了一些错误,并且尚未在Android SDK Manager中发布。另请注意,这里有newer commits,但是它们包含new bugs,因此不应使用。

10-07 15:32