一段时间后,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 在服务中变慢的主要内容,如果未能解决你的问题,请参考以下文章

查询在条件 IF 中变慢

使用 AsyncTask 会使应用程序变慢

使用 AsyncTask 解析 HTML 使主线程变慢

Redis都有哪些慢操作?

sockettcp通信,跑一段时间后,延迟很严重

一段时间后 cocos2d 代码变慢