我正在使用一个使用异步任务的应用来执行短期后台计算工作。这些似乎结束了(通过onPostExecute()等),但在Eclipse调试器中,仍有一个或多个仍然存在。
然后我找到了这个链接 - AsyncTask threads never die - 好吧,这是关于一个线程池,理论上不是问题。
然而,问题是,我也在尝试使用Google应用内结算代码V3,这似乎会在您执行购买时抛出异常并且已经存在AsyncTask线程。抓住异常无济于事 - 它仍然无法做任何事情。
我该如何解决这个问题?我需要做些什么来保证旧的计算线程已经消失?
答案 0 :(得分:1)
发现这里发生了什么,这不是我的想法。我会在这里详细说明,因为它可能对某人有用。与其他AsyncTask线程和线程池没有任何关系。
在IabHelper类中有两个函数flagStartAsync()和flagEndAsync()。这些目的是在传统的多线程中产生单个传递门(像wait()和signal()一样),因此一次只能进行一次异步操作(即与Google Play和服务器的通信)。如果在某些事情已经发生时调用flagStartAsync(),则会产生异常。不是很优雅,但我觉得很有效。
在其他地方的launchPurchaseFlow()开始时调用flagStartAsync()'test和set',并在handleActivityResult()中再次调用flagEndAsync,以及其他地方。因此,提供购买流程总能产生结果,没有问题。问题是 - 它并不总是。
如果查看launchPurchaseFlow(),有几条路径不会启动异步操作,如果其中一条路径被取消,mAsyncInProgress(相关标志)将被设置为左侧。
在我的案例中,我没有检查到该物品是否已经购买,而且“已经购买”是其中一条路径。 Mea culpa,但问题是我无法说服自己,有些其他路径你有时无法避免。例如,如果操作很慢并且“购买”按钮被按两次怎么办?我打赌还有其他人。人们可以捕获异常,这将阻止崩溃,但如果没有任何东西最终清除旗帜,那将无济于事。我想异常处理程序可以调用flagEndAsync()但它有一个令人不舒服的“大锤”来破解坚果的感觉。
令我印象深刻的是,这可能是一段不健全的代码。我现在所做的是以launchPurchaseFlow()的各种方式调用flagEndAsync(),但这只是一个临时修复。我对IabHelper代码知之甚少,但我认为它需要更仔细的思考,我需要分析它以查看它所做的一切。