AsyncTask через некоторое время замедляется в службе - PullRequest
0 голосов
/ 26 ноября 2018

Мне нужно делать несколько запросов к базе данных и другим заданиям каждую секунду.Я использовал классы Service, Timer и AsyncTask для работы в фоновом режиме.В первые минуты все нормально и работает без лагов, но через несколько минут становится все медленнее и медленнее.Как я могу справиться со своей работой без этого плохого эффекта:

   @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    final Handler handler = new Handler();
        Timer timer = new Timer();
        TimerTask doAsynchronousTask = new TimerTask() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                            PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask();
                            performBackgroundTask.execute();
                    }
                });
            }
        };
        timer.schedule(doAsynchronousTask, 0, 1000); 
    return Service.START_STICKY;
}

  class PerformBackgroundTask extends AsyncTask<Void, Void, Void>{
    @Override
    protected Void doInBackground(Void... voids) {
       // do database queries and other ...
        return null;
    }
}

Я уже использовал IntentService и AlarmManager для этого, и ничего не изменилось.Из logcat используется только 4 пула потоков.

1 Ответ

0 голосов
/ 26 ноября 2018

Это из-за нескольких AsyncTask в таймере, он отлично работает, когда у вас меньше AsyncTask.

Ограничения AysncTask

До Android 1.6 размер пула ядра был1, а максимальный размер пула равен 10. Начиная с Android 1.6, размер основного пула равен 5, а максимальный размер пула равен 128. Размер очереди равен 10 в обоих случаях.Тайм-аут активности продолжался 10 секунд до 2,3 и с тех пор 1 секунда.

AsyncTask будет отображаться только для выполнения 5/6 ваших задач.Шестое задание ставится в очередь до тех пор, пока одно из других заданий не будет выполнено.Это очень веская причина, по которой вы не должны использовать AsyncTasks для длительных операций - это предотвратит запуск других AsyncTasks.

Решение

В этом случаевы должны использовать поток с вашим собственным пулом потоков executor.thu поставит задачу в очередь и будет выполнять задачи на основе ваших приоритетов

...