虽然我手边没有参考资料,但我认为可以安全地假设Android在优先级为android.os.Process.THREAD_PRIORITY_BACKGROUND的线程中执行AsyncTask.doInBackground()
这意味着这个线程是在Linux cgroup(调度类)的上下文中调度的 - 总是或在频繁的情况下,我不确定并且已经阅读了各种声明 - 常见CPU时间的上限5%或10% - 再次,不同来源提出不同的主张 - 适用。
换句话说,所有后台线程必须共享可用CPU时间的5%或10%。再一次,我已经读过声称如果前台和实时任务空闲,这是动态调整的,但我很乐意自己指出一个可信的来源。此外,我不会指望它,因为用户可以在使用我的应用程序时收听实时音频流。
如果您调整后台线程的优先级,如下所示:
private static final int bgThreadPrio = Process.THREAD_PRIORITY_BACKGROUND +
Process.THREAD_PRIORITY_MORE_FAVORABLE;
protected YourReturnType doInBackground() {
Process.setThreadPriority(bgThreadPrio);
....
}
然后你实现了两件事。
您将线程移出后台cgroup,这样它就不必与其他后台线程共享10%的CPU时间(至少目前,直到Android在这方面更改其策略)。
您为线程分配优先级,这通常不会对用户界面和实时线程产生极其严重的影响,因为THREAD_PRIORITY_DEFAULT为0而THREAD_PRIORITY_BACKGROUND为10.因此您的线程将以优先级9运行,这比0差得多但它会避免后台任务的人为限制。
但是,您也可能更改底层AsyncTask执行程序为您的AsyncTask提供的Thread的优先级。此线程将被回收,它可以是单个线程或从池中选择。因此,在应用程序的所有AsyncTasks中的所有doInBackground()方法中设置优先级可能是个好主意。