Android AsyncTask在USB调试和standadlone设备之间运行时间差

时间:2014-04-26 21:17:26

标签: android multithreading android-asynctask

我有一个长时间运行的后台任务,涉及繁重的计算和磁盘读取。

当我的nexus 5通过usb调试连接到我的笔记本电脑时,后台任务的总运行时间约为。 7分钟。

当我单独在设备上运行它而未连接时,可能需要长达1小时。检查logcat表明它被阻塞了不同的时间间隔。

我认为这部分是由于调度所以我试图使用andorid.os.Process强制执行异步任务的优先级,确保它使用task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)并行,并且我也尝试使用Java相反,我会得到相同的结果。

我是否遗漏了有关USB调试和运行aynctask的事情?如果我单独开始在手机上运行我的应用程序,然后插入USB以查看logcat,我可能会看到它先前已被阻止,但它会以正常速度运行。我的处理非常密集,但我需要尽快完成。有没有办法做到这一点?我目前正在使用IntentService进行测试,但希望先得到一些建议。

所以我的问题是:

在调度方面,usb调试和单独在设备上运行是否存在差异,因为单独在设备上运行时我的异步任务被阻止,而在使用USB调试的设备上运行时却没有?

其次,我怎样才能确保我的后台任务以最小的中断运行,或者是否有更好的方法在主线程上运行7分钟的长期计算任务?

2 个答案:

答案 0 :(得分:1)

我不认为USB调试会影响后台任务的速度。但是,我知道您不应该使用AsyncTasks进行繁重的长时间运行网络或计算。它们不是为了这个。

如文档中所述

  

AsyncTask旨在成为Thread和Handler的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒钟)。如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。

也许您可以查看使用Service进行长时间运行的操作。服务可以从活动开始,并可以通过广播接收器进行通信。

答案 1 :(得分:0)

我认为这个问题归咎于CPU进入睡眠状态。

我发现一个带有唤醒锁的Intentservice来保持CPU的功能。我想也许在USB调试发生时CPU没有睡觉?