【问题标题】:Implementation of onDestroy to close a Billing Client执行 onDestroy 以关闭计费客户端
【发布时间】:2017-10-18 05:42:28
【问题描述】:

我正在尝试以here 描述的 Play Billing 应用程序为例

在最后一步他们已经描述了

要清理所有资源并注销观察者,您只需调用 BillingClient.endConnection。所以在 BillingManager 中定义一个带有这个调用的方法,然后从 GamePlayActivity.onDestroy 中调用它:

根据上述信息,我在BillingManagerjava 类中创建了这样的函数destroy

public void destroy() {
        mBillingClient.endConnection();
    }

我的完整 BillingManager 课程如下所示

public class BillingManager implements PurchasesUpdatedListener {
    private final BillingClient mBillingClient;
    private final Activity mActivity;
    private static final String TAG = "BillingManager";

    public BillingManager(Activity  activity) {

        mActivity = activity;
        mBillingClient = BillingClient.newBuilder(mActivity).setListener(this).build();
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponse) {
                if (billingResponse == BillingClient.BillingResponse.OK) {
                    Log.i(TAG, "onBillingSetupFinished() response: " + billingResponse);
                } else {
                    Log.w(TAG, "onBillingSetupFinished() error code: " + billingResponse);
                }
            }
            @Override
            public void onBillingServiceDisconnected() {
                Log.w(TAG, "onBillingServiceDisconnected()");
            }
        });
    }

    public void startPurchaseFlow(final String skuId, final String billingType) {
        // Specify a runnable to start when connection to Billing client is established
        Runnable executeOnConnectedService = new Runnable() {
            @Override
            public void run() {
                BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                        .setType(billingType)
                        .setSku(skuId)
                        .build();
                mBillingClient.launchBillingFlow(mActivity, billingFlowParams);
            }
        };

        // If Billing client was disconnected, we retry 1 time
        // and if success, execute the query
        startServiceConnectionIfNeeded(executeOnConnectedService);
    }

    @Override
    public void onPurchasesUpdated(@BillingClient.BillingResponse int responseCode,
                                   List<Purchase> purchases) {
        Log.d(TAG, "onPurchasesUpdated() response: " + responseCode);
    }

    private static final HashMap<String, List<String>> SKUS;
    static
    {
        SKUS = new HashMap<>();
        SKUS.put(BillingClient.SkuType.INAPP, Arrays.asList("gas", "premium"));
        SKUS.put(BillingClient.SkuType.SUBS, Arrays.asList("gold_monthly", "gold_yearly"));
    }

    public List<String> getSkus(@BillingClient.SkuType String type) {
        return SKUS.get(type);
    }

    public void querySkuDetailsAsync(@BillingClient.SkuType final String itemType,
                                     final List<String> skuList, final SkuDetailsResponseListener listener) {
        // Specify a runnable to start when connection to Billing client is established
        Runnable executeOnConnectedService = new Runnable() {
            @Override
            public void run() {
                SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder()
                        .setSkusList(skuList).setType(itemType).build();
                mBillingClient.querySkuDetailsAsync(skuDetailsParams,
                        new SkuDetailsResponseListener() {
                            @Override
                            public void onSkuDetailsResponse(int responseCode,
                                                             List<SkuDetails> skuDetailsList) {
                                listener.onSkuDetailsResponse(responseCode, skuDetailsList);
                            }
                        });
            }
        };

        // If Billing client was disconnected, we retry 1 time
        // and if success, execute the query
        startServiceConnectionIfNeeded(executeOnConnectedService);
    }

    private void startServiceConnectionIfNeeded(final Runnable executeOnSuccess) {
        if (mBillingClient.isReady()) {
            if (executeOnSuccess != null) {
                executeOnSuccess.run();
            }
        } else {
            mBillingClient.startConnection(new BillingClientStateListener() {
                @Override
                public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponse) {
                    if (billingResponse == BillingClient.BillingResponse.OK) {
                        Log.i(TAG, "onBillingSetupFinished() response: " + billingResponse);
                        if (executeOnSuccess != null) {
                            executeOnSuccess.run();
                        }
                    } else {
                        Log.w(TAG, "onBillingSetupFinished() error code: " + billingResponse);
                    }
                }
                @Override
                public void onBillingServiceDisconnected() {
                    Log.w(TAG, "onBillingServiceDisconnected()");
                }
            });
        }
    }

    public void destroy() {
        mBillingClient.endConnection();
    }
}

我的 GamePlayActivity 如下所示

public class GamePlayActivity extends FragmentActivity implements BillingProvider {

@Override
    protected void onDestroy() {
        super.onDestroy();

// I want call method here
    }

}

现在我想在我的游戏活动中调用上述函数。我不知道怎么称呼它。

【问题讨论】:

  • new BillingManager().destroy() 将是一个好的开始......如果没有看到本课程的其余部分以及您如何与之互动,很难回答。请提供minimal reproducible example
  • @cricket_007 也可以使用铸造活动来完成
  • @AmitVaghela 我已添加完整代码,请检查
  • 尝试链接 ((MainActivity) mContext).onDestroy();在您的活动中,如果未完成请通知@Priya
  • 那不可能是完整的代码。您的 Activity 没有 onCreate 方法

标签: java android in-app-billing


【解决方案1】:

如文档中所述

从 GamePlayActivity.onDestroy 调用它

但是你定义了你自己的方法。

重写 GamePlayActivity 的 onDestroy 方法并将 mBillingClient.endConnection(); 放入其中。

@Override
protected void onDestroy() {
    mBillingClient.endConnection();
}

【讨论】:

  • 也可以在 onDestroy 中调用其他销毁方法
  • @Priya 这真的没有必要。此外,这是一个方法调用 - 所以就去做吧
  • 它给了我 mBillingClient 无法解决的错误
  • @Priya,您应该已经有一个 BillingManager 实例。做bm.destroy()。否则new BillingManager().destroy() 会执行你的方法,但我想如果你必须这样做,你的逻辑就有很大的错误。
【解决方案2】:

我假设你的 Activity 已经有一个 BillingManager 的实例

public class GamePlayActivity extends FragmentActivity implements BillingProvider {

    BillingManager bm;  // assign this in onCreate 

    @Override
    protected void onDestroy() {
        super.onDestroy();
        bm.destroy();
   }

}

【讨论】:

  • 是否需要将 bm.destroy() 放在 super.onDestroy() 行上方?
  • 需要先调用Super
  • 你能简单描述一下吗?谢谢
  • @YasiruNayanajith 你想在你自己的应用程序之前调用框架的destroy方法stackoverflow.com/questions/4595512/…
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 2015-09-24
  • 1970-01-01
相关资源
最近更新 更多