Java onDestroy关闭计费客户端的实现
我试图做一个例子播放计费应用程序描述 在最后一步中,他们描述了 要清除所有资源并注销观察者,只需调用BillingClient.endConnection。因此,请在BillingManager中使用此调用定义一个方法,然后从GamePlayActivity.onDestroy调用它: 根据以上信息,我在Java onDestroy关闭计费客户端的实现,java,android,in-app-billing,Java,Android,In App Billing,我试图做一个例子播放计费应用程序描述 在最后一步中,他们描述了 要清除所有资源并注销观察者,只需调用BillingClient.endConnection。因此,请在BillingManager中使用此调用定义一个方法,然后从GamePlayActivity.onDestroy调用它: 根据以上信息,我在BillingManagerjava类中创建了这样一个名为destroy的函数 public void destroy() { mBillingClient.endConnect
BillingManager
java类中创建了这样一个名为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();
}
}
public class GamePlayActivity extends FragmentActivity implements BillingProvider {
@Override
protected void onDestroy() {
super.onDestroy();
// I want call method here
}
}
现在我想在我的游戏活动中调用上述函数。我不知道怎么称呼它 如文件中所述 从GamePlayActivity.onDestroy调用它 但是你定义了自己的方法 覆盖GamePlayActivity的onDestroy方法,并放置mBillingClient.endConnection()代码>进入它
@Override
protected void onDestroy() {
mBillingClient.endConnection();
}
我假设您的活动已经有了BillingManager的实例
public class GamePlayActivity extends FragmentActivity implements BillingProvider {
BillingManager bm; // assign this in onCreate
@Override
protected void onDestroy() {
super.onDestroy();
bm.destroy();
}
}
新建BillingManager().destroy()
将是一个良好的开端。。。如果没有看到本课程的其他部分以及你如何与之互动,很难回答。请提供@cricket\u 007,可以使用铸造活动完成also@AmitVaghela我已经添加了完整的代码,请检查ittry链接((MainActivity)mContext.onDestroy();在您的活动中,如果没有,请通知done@PriyaThat不能是完整代码。你的活动没有onCreate方法,你也可以在其中调用另一个destroy方法onDestroy@Priya那真的没有必要。另外,它是一个方法调用,所以只需执行mBillingClient无法执行的错误resolved@Priya,您应该已经有了BillingManager的实例。执行bm.destroy()。否则,new BillingManager().destroy()
将执行您的方法,但我想如果必须这样做,您的逻辑中会有一个巨大的错误。是否需要将bm.destroy()放在super.ondestory()行上方?需要首先调用super。请简要描述一下。Thanks@YasiruNayanajith您希望在自己的应用程序之前调用框架的destroy方法