一段时间后,AsyncTask 在服务中变慢
Posted
技术标签:
【中文标题】一段时间后,AsyncTask 在服务中变慢【英文标题】:AsyncTask after a while become slow in Service 【发布时间】:2019-04-28 01:19:47 【问题描述】:我需要每秒钟对数据库和其他作业执行少量请求。我使用 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 个线程池。
【问题讨论】:
blogs.innovationm.com/multiple-asynctask-in-android ***.com/questions/9654148/… 【参考方案1】:这是因为定时器中有多个AsyncTask,当你的AsyncTask较少时它可以完美地工作。
AysncTask 的限制
在 Android 1.6 之前,核心池大小为 1,最大池大小为 10。从 Android 1.6 开始,核心池大小为 5,最大池大小为 128。队列大小在这两种情况下都是 10 . keep-alive 超时是 2.3 之前的 10 秒,之后是 1 秒。
AsyncTask 只会执行 5/6 的任务。第 6 个任务正在排队等待其他任务之一完成。这是您不应该将 AsyncTasks 用于长时间运行的操作的一个很好的理由 - 它会阻止其他 AsyncTasks 运行。
解决方案
在这种情况下,您应该将线程与您自己的线程池执行器一起使用。它将根据您的优先级将任务排队并占用任务
【讨论】:
很好的解释以上是关于一段时间后,AsyncTask 在服务中变慢的主要内容,如果未能解决你的问题,请参考以下文章