我需要每秒对数据库和其他作业进行几次请求。我使用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个线程池。
答案 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永远运行。
解决方案
在这种情况下,您应该将线程与自己的线程池执行程序一起使用。这将使任务排队并根据优先级处理任务