【问题标题】:AsyncTask thread never endsAsyncTask 线程永远不会结束
【发布时间】:2013-09-30 12:45:27
【问题描述】:

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

然后我找到了这个链接 - AsyncTask threads never die - 好吧,这是关于线程池的,理论上不是问题。

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

我该如何解决这个问题?我需要做些什么来保证旧的计算线程已经消失?

【问题讨论】:

  • “每当您进行购买并且已经有一个 AsyncTask 线程挂起时,这似乎会引发异常” - 我将专注于提出一个问题,您在哪里为此提供证据并要求帮助了解为什么会发生这种情况。 IOW,您在问如何摆脱粉红色大象的侵扰,而没有任何证据表明存在粉红色大象。由于AsyncTask 线程池行为已经存在了四年,根据您的说法,应用内计费将适用于大约零个应用程序,这似乎不太可能。

标签: android android-asynctask in-app-billing


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2013-04-09
    • 2010-12-27
    • 1970-01-01
    • 2014-11-26
    • 2021-08-05
    相关资源
    最近更新 更多