是的,这个问题有两个常见的答案:
一:在开始异步操作之前调用billingHelper.flagEndAsync();
的hack。这通常被认为是不推荐的,并且在许多情况下都没有解决问题。
二:在活动handleActivityResult
中调用IabHelper的onActivityResult
方法。这个解决方案的问题(除了我不理解这个方法的目的)是在我的应用程序中,应用程序内的计费操作在应用程序的Application类中完成,因为应用程序中有一堆活动,用户可能会触发应用内购买以及应用需要查询应用内购买广告资源的多个可能的入口点。所以我试着把:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!MyApplication.myAppInstance.mHelper.handleActivityResult(requestCode, resultCode, data))
super.onActivityResult(requestCode, resultCode, data);
}
进入用户可能开始购买的每个活动,但这并没有解决崩溃问题。我真的不明白这个onActivityResult的目的,所以我可能误解了它应该如何实现。为什么Google要强迫我从活动中进行应用内结算操作?
答案 0 :(得分:11)
我有类似的问题。遗憾的是,IabHelper
代码并不是很好......它主要是好的,但是线程模型有点混乱,这意味着如何正确处理边缘情况会让人感到困惑。
摆脱崩溃的简单方法是使用if语句检查来简单地包装方法调用,如:
if (!mHelper.isAsyncInProgress()) {
mHelper.launchPurchaseFlow(...);
}
更好的解决方案是从头开始重写IabHelper
代码......但在这种特殊情况下,异常很少发生,可能不值得。不幸的是,在这种情况下,没有一个简单的解决办法...... IabHelper
示例代码并不是最好的,我们大多数人都会决定与之共处。
答案 1 :(得分:4)
拥有launchPurchaseFlow的标志会忽略多次购买流程的启动。但遗憾的是,如果用户在Google In App Billing serviceIntent中错误地点击了Back Button,则会失败。在这种情况下,标志应重置为false。否则,用户将无法再次尝试购买。
if(!mHelper.isAsyncInProgress())
{
mHelper.launchPurchaseFlow(...);
}
// Invoke below method to reset onBackPressed
public static void resetAsyncInProgress() {
mHelper.setAsyncInProgress(false);
}