0

我正在使用一个使用异步任务来执行短期后台计算工作的应用程序。这些似乎可以结束(通过 onPostExecute() 等),但在 Eclipse 调试器中,一个或多个仍然存在。

然后我找到了这个链接 - AsyncTask 线程永远不会死- 好吧,它是关于线程池的,理论上不是问题。

然而问题是,我也在尝试使用 Google 应用内计费代码 V3,每当您进行购买并且已经有一个 AsyncTask 线程挂在周围时,这似乎都会引发异常。捕捉异常无济于事——它仍然无济于事。

我怎样才能解决这个问题?我需要做些什么来保证旧的计算线程已经消失?

4

1 回答 1

1

发现这里发生了什么,这不是我想的那样。我会在这里详细介绍它,因为它可能对某人有用。与其他 AsyncTask 线程和线程池无关。

IabHelper 类中有两个函数 flagStartAsync() 和 flagEndAsync()。这样做的目的是产生一个单通道门(有点像传统多线程中的 wait() 和 signal()),因此一次只能发生一个异步操作(即与 Google Play 和服务器的通信)。如果 flagStartAsync() 在某些事情已经发生时被调用,它会产生一个异常。不是非常优雅,但我猜是有效的。

flagStartAsync() 'test and set' 在 launchPurchaseFlow() 开始时被调用,而 flagEndAsync 在 handleActivityResult() 中被调用 - 再次 - 在其他地方。因此,提供购买流程总是会产生结果,没问题。问题是——并非总是如此。

如果您查看 launchPurchaseFlow() ,则有几条路径不会启动异步操作,如果其中一条被采用,则 mAsyncInProgress (相关标志)将保持设置。

在我的案例中,让我感到震惊的是,我没有检查过该物品是否已经购买,而“已经购买”是出路之一。过失,但问题是我无法说服自己,没有其他几条路是你有时无法避免的。例如,如果操作缓慢并且“购买”按钮被按下两次怎么办?我敢打赌还有其他人。可以捕获异常,这将停止崩溃,但如果最终没有任何东西清除标志,这将无济于事。我猜异常处理程序可以调用 flagEndAsync() 但它有一种不舒服的“大锤敲碎坚果”的感觉。

令我震惊的是,这可能是一段不健壮的代码。我现在所做的是在launchPurchaseFlow() 之外以各种方式调用flagEndAsync(),但这只是一个临时修复。我对 IabHelper 代码了解得不够多,但我认为它需要更仔细的思考,我需要对其进行分析以了解它所做的一切。

于 2013-09-30T14:09:20.170 回答