我正在使用谷歌教程推荐的IabHelper
实用程序类,这个错误让我深受打击。显然,IabHelper
不能同时运行多个异步操作。我甚至试图在盘点仍在进行的时候开始购买,成功了。
我已经按照这里的建议尝试在我的主类中实现了onActivityResult
,但在出现错误之前,我甚至没有得到对该方法的调用。然后我找到了这个,但我不知道在哪里可以找到这个flagEndAsync
方法——它不在IabHelper
类中。
现在我正在寻找一种方法来解决这个问题(而不需要重新实现整个她-邦)。我能想到的唯一解决方案是创建一个布尔字段asyncActive
,在异步任务启动前检查这个字段,如果有另一个任务处于活动状态,就不要这样做。但这有许多其他问题,不能跨活动运行。此外,我更喜欢让异步任务排队,并在允许的情况下尽快运行,而不是根本不运行。
这个问题有什么解决办法吗?
这不容易破解,但我找到了必要的变通办法。最近对谷歌非常失望,他们的Android网站变得一团糟(很难找到有用的信息),他们的示例代码也很差。几年前我做Android开发的时候,一切都变得容易多了!这是另一个例子...
事实上,IabUtil是有缺陷的,它不能正确地调用自己的异步任务。稳定这个东西的一整套必要的变通方法:
1) 将方法flagEndAsync
公开。它就在那里,只是看不见而已。
2) 让每个侦听器调用帮助器。确保程序被正确标记为已完成;似乎所有的听众都需要它。
3)用一个
try/cat
来包围调用,以捕获可能发生的IllegalStateExc0019
,并以这种方式处理它。
确保在活动的onActivityResult
中调用IabHelper的handleActivityResult
,而不是在片段的onActivityResult
中调用。
以下代码片段来自TripItileDrive的MainActivity:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
if (mHelper == null) return;
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
// not handled, so handle it ourselves (here's where you'd
// perform any handling of activity results not related to in-app
// billing...
super.onActivityResult(requestCode, resultCode, data);
}
else {
Log.d(TAG, "onActivityResult handled by IABUtil.");
}
}
更新:
一个简单而棘手的解决方案
在调用购买项目方法之前,只需添加这一行
if (billingHelper != null) billingHelper.flagEndAsync();
所以你的代码看起来是这样的
if (billingHelper != null) billingHelper.flagEndAsync();
purchaseItem("android.test.purchased");
注意:如果您从另一个包调用它,不要忘记在IabHelper中公开标记EndAsync()方法。
概述 定时器 Promise 对象
我第一次实现应用内计费,并使用静态SKU ID测试我的第一次购买。 第一次工作得很好。我调用了并完成了测试购买。我的活动收到了回调,我确保用处理它。一切都很棒。 然而,我想测试下一部分,所以我重新启动了应用程序,并尝试购买相同的SKU(静态SKU)。 第二次尝试购买物品时,我的被调用,我在日志中看到:“应用内计费错误:无法购买物品,错误响应:7:物品已拥有” 这是有道理的,但如果我尝试购买其他物品
下面的这些操作符属于单独的rxjava-async模块,它们用于将同步对象转换为Observable。 start( ) — 创建一个Observable,它发射一个函数的返回值 toAsync( ) or asyncAction( ) or asyncFunc( ) — 将一个函数或者Action转换为已Observable,它执行这个函数并发射函数的返回值 startFuture( ) — 将
单线程模型 单线程模型指的是,JavaScript 只在一个线程上运行。也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待。 注意,JavaScript 只在一个线程上运行,不代表 JavaScript 引擎只有一个线程。事实上,JavaScript 引擎有多个线程,单个脚本只能在一个线程上运行(称为主线程),其他线程都是在后台配合。 JavaScript 之所以采
默认情况下playbook中的任务执行时会一直保持连接,直到该任务在每个节点都执行完毕.有时这是不必要的,比如有些操作运行时间比SSH超时时间还要长. 解决该问题最简单的方式是一起执行它们,然后轮询直到任务执行完毕. 你也可以对执行时间非常长(有可能遭遇超时)的操作使用异步模式. 为了异步启动一个任务,可以指定其最大超时时间以及轮询其状态的频率.如果你没有为 poll 指定值,那么默认的轮询频率是
使用spray时,我一直遇到相同的设计问题,即在Akka中执行一些异步(tell)操作之后,如何为请求找到spray http请求的原始上下文。 我使用的是Net-a-Porter actor per request模型。它创建了一个子执行元,我指定该子执行元来处理每个请求,该子执行元由另一个包含正确请求上下文的执行元进行封装。