ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor

我正在设计一个具有重复任务的应用程序,只要该应用程序在前台,它就会将状态发送到专用服务器。

在网上搜索中,我看到了几种不同的方法,并且想知道什么是最好的方法。

安排服务器调用的最佳方法是什么?

我看到的选项是:

  • Timer
  • ScheduledThreadPoolExecutor
  • Service
  • AlarmManager的BroadcastReciever。

  • 你怎么看?

    编辑:我需要它的原因是基于聊天的应用程序,该应用程序将所有用户操作发送到远程服务器。即用户正在键入消息,用户正在阅读消息,用户在线,用户离线等。

    这意味着每隔一个间隔,我需要向服务器发送我在做什么,因为我与其他人打开聊天室,所以他们需要知道我在做什么。

    类似于whatsapp消息反馈机制:

    编辑#2:
    现在应该几乎总是通过JobScheduler API(或对于较低的API为 FirebaseJobDispatcher )来安排重复执行的任务,以防止电池耗尽的问题,这可以在Android培训的vitals section中读取

    编辑#3:
    FirebaseJobDispatcher已被弃用,并由Workmanager取代,该文件还包含JobScheduler的功能。

    最佳答案

    我不确定,但是据我所知我同意我的观点。如果我错了,我总是接受最佳答案。
    警报管理器
    只要警报接收器的onReceive()方法正在执行,警报管理器就会保持CPU唤醒锁。这样可以确保手机在完成广播处理之前不会进入休眠状态。一旦onReceive()返回,警报管理器将释放此唤醒锁。这意味着在某些情况下,一旦onReceive()方法完成,电话就会进入休眠状态。如果您的警报接收器称为Context.startService(),则手机可能会在启动请求的服务之前进入休眠状态。为避免这种情况,您的BroadcastReceiverService将需要实现单独的唤醒锁定策略,以确保手机继续运行直至服务可用。
    注意:警报管理器适用于希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行。对于正常的计时操作(滴答声,超时等),使用Handler会更容易且效率更高。
    计时器

    timer = new Timer();
    
        timer.scheduleAtFixedRate(new TimerTask() {
    
            synchronized public void run() {
    
                \\ here your todo;
                }
    
            }, TimeUnit.MINUTES.toMillis(1), TimeUnit.MINUTES.toMillis(1));
    
    Timer具有ScheduledThreadPoolExecutor解决的一些缺点。所以这不是最好的选择
    ScheduledThreadPoolExecutor
    您可以使用java.util.TimerScheduledThreadPoolExecutor(首选)将操作安排为在后台线程上定期执行。
    这是使用后者的示例:
    ScheduledExecutorService scheduler =
        Executors.newSingleThreadScheduledExecutor();
    
    scheduler.scheduleAtFixedRate
          (new Runnable() {
             public void run() {
                // call service
             }
          }, 0, 10, TimeUnit.MINUTES);
    
    所以我更喜欢ScheduledExecutorService但也请考虑一下,如果更新将在您的应用程序运行时进行,则可以使用Timer(如其他答案中所建议的那样),也可以使用较新的ScheduledThreadPoolExecutor
    如果您的应用程序即使没有运行也将更新,则应使用AlarmManager

    请注意,如果您计划在关闭应用程序时进行更新,则十分频繁,每十分钟一次,因此可能会有点耗电。

    09-10 06:04
    查看更多