我根据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,因此不应使用。