在应用程序计费 - 快速设备方向 - 导致崩溃(IllegalStateException)

bri*_*gsm 5 android device-orientation illegalstateexception in-app-billing

我根据Android的实施应用内结算指南实施了应用内结算(v3).

一切正常,直到我旋转设备,然后立即将其旋转回原来的方向.实际上,有时它会起作用,有时会崩溃:

java.lang.IllegalStateException: IabHelper was disposed of, so it cannot be used.

似乎这与IAB的异步性质有关,尽管我并不积极.

有什么想法吗?

Ben*_*n H 6

您可能正在获取异常,因为您调用了活动生命周期中的某个位置mHelper.dispose(),然后尝试使用相同的已处置实例.我的建议是只处理mHelper onDestroy()并重新创建它onCreate().

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

我的解决方案是修改IabHelper以允许您在handleActivityResult(...)没有调用的情况下告诉它launchPurchaseFlow(...).我在IabHelper.java中添加了以下内容

public void expectPurchaseFinished(int requestCode, OnIabPurchaseFinishedListener listener)
{
    mRequestCode = requestCode;
    mPurchaseListener = listener;
}
Run Code Online (Sandbox Code Playgroud)

这将导致IabHelper在调用onIabPurchaseFinished(...)时调用侦听handleActivityResult(...)器.然后,你这样做:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    mHelper.expectPurchaseFinished(requestCode, mPurchaseFinishedListener);
    mHelper.handleActivityResult(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)

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