一段时间后AsyncTask服务变慢

时间:2018-11-26 11:43:48

标签: android service android-asynctask

我需要每秒对数据库和其他作业进行几次请求。我使用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 :(得分:2)

这是因为计时器中有多个AsyncTask,当您的AsyncTask较少时,它可以完美工作。

AysncTask的限制

在Android 1.6之前,核心池大小为1,最大池大小为10。从Android 1.6开始,核心池大小为5,最大池大小为128。在两种情况下,队列的大小均为10。 。保持活动超时时间为2.3之前的10秒,此后为1秒。

AsyncTask只会执行5/6个任务。第6个任务正在排队,直到其他任务之一完成。这是一个很好的理由,为什么您不应该将AsyncTasks用于长时间运行的操作-这将阻止其他AsyncTasks永远运行。

解决方案

在这种情况下,您应该将线程与自己的线程池执行程序一起使用。这将使任务排队并根据优先级处理任务