Вы не единственный, кто наблюдает за этим поведением.Замедление в 10 раз, вероятно, является результатом того, что Android использует cgroup Linux (класс планирования) для потоков с приоритетом BACKGROUND или ниже.Все эти потоки должны жить с 10% процессорного времени в целом.
Хорошая новость заключается в том, что вам не нужно жить с настройками приоритетов потоков из java.lang.Thread.Вы можете назначить вашему потоку приоритет pthread (потока Linux) из определений в android.os.Process.Там у вас есть не только Process.THREAD_PRIORITY_BACKGROUND, но также и константы, позволяющие немного отрегулировать приоритет.
В настоящее время Android использует группу фоновых потоков для всех потоков с приоритетом THREAD_PRIORITY_BACKGROUND или хуже, а THREAD_PRIORITY_BACKGROUND_PRI_DEFITY_PRA 10 равен THERAD0 и THREAD_PRIORITY_FOREGROUND равно -2.
Если вы выберете THREAD_PRIORITY_BACKGROUND + THREAD_PRIORITY_MORE_FAVORABLE (он же 9), ваш поток будет удален из фоновой группы с ограничением в 10%, хотя это не настолько важно, чтобы прерывать интерфейс пользователя.слишком часто.
Я полагаю, что есть фоновые задачи, которые требуют немного вычислительной мощности, но в то же время не настолько важны, чтобы де-факто блокировать пользовательский интерфейс (потребляя слишком много ЦП в отдельном потоке).и Android в настоящее время не имеет явного приоритета для их назначения, поэтому, на мой взгляд, это один из лучших приоритетов, которые вы можете назначить для такой задачи.
Если вы можете использоватьHandlerThread, которого легко достичь:
ht = new HandlerThread("thread name", THREAD_PRIORITY_BACKGROUND + THREAD_PRIORITY_MORE_FAVORABLE);
ht.start();
h = new Handler(ht.getLooper());
Если вы хотите использовать AsyncTask, вы все равно можете сделать
protected final YourResult doInBackground(YourInputs... yis) {
Process.setThreadPriority(THREAD_PRIORITY_BACKGROUND + THREAD_PRIORITY_MORE_FAVORABLE);
...
}
, но помните, что базовая реализация может повторно использовать тот же объект Threadдля разных задач, для следующей AsyncTask или чего-то еще.Похоже, что Android просто сбрасывает приоритет после возврата doInBackground ().
Конечно, если ваш пользовательский интерфейс действительно потребляет процессор, и вы хотите в то же время больше энергии для своей задачи, убирая его из пользовательского интерфейса, вы можете установить другой приоритет, возможно вплоть до Process.THREAD_PRIORITY_FOREGROUND.