java - 服务 ScheduleTask 未按固定时间间隔启动

标签 java android service scheduled-tasks intervals

我有一项服务需要比较以前和当前的 html 代码。

我已将其配置为每 1 小时执行一次,但实际上它以奇怪的非线性间隔执行。我在代码中添加了一个命令来写入日志文件,以便在工作完成时查看。结果很奇怪:有时间隔不到一个小时,有时更多(2-3小时),有时真的是1小时...... 编辑:当间隔较短(1分钟)时它正常运行 这是我的代码:

    ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleWithFixedDelay(new Runnable() {

        public void run() {
            try {
                if (isNetworkAvailable()) {
                    doServiceWork();
                    check("SLeEPING!!!", c);
                }
                else {
                    check ("NO INTERNET", c);
                }
            }
            catch (Exception e) {check("78", c);}
        }
    }, 1, 3600, TimeUnit.SECONDS);

}

最佳答案

使用报警管理器。你正在让线程 hibernate ,我不确定 Android 是否保证它会以这种方式工作。这样的事情应该可以帮助你。这将每小时启动一次服务:

PendingIntent serviceIntent= PendingIntent.getService(context,
                    0, new Intent(context, MyService.class), 0);

            long firstTime = SystemClock.elapsedRealtime();
            AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

            long currenciesIntervalInSec = 3600;

            if (automaticCurrencies)
                am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, currenciesIntervalInSec*1000, serviceIntent);

编辑:

您应该扩展 IntentService。它负责线程并且所有事情都在后台完成(如果您需要在后台执行操作并且不需要同时使用多个线程,它特别有用)。无论您在 HandleIntent 中放置什么,都将在您启动服务时执行。在内部它将保留队列列表。

例如这是一个简单的服务类(您需要创建两个构造函数):

public class MyService extends IntentService {

    public MyService() {
        super("MyService");
    }

    public MyService(String name) {
        super(name);        
    }

    @Override
    protected void onHandleIntent(Intent arg0) {

               if (isNetworkAvailable()) {
                    doServiceWork();
                    check("SLeEPING!!!", c);
                }
                else {
                    check ("NO INTERNET", c);
                }

        }
}

另外,你需要在你的 list 中添加这个(当然是用你自己的包):

<service android:name="com.services.MyService"/>  

关于java - 服务 ScheduleTask 未按固定时间间隔启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8702413/

相关文章:

android - 尝试在 android 中编写只读数据库

android - 启动服务在 Android 中不起作用

java - JUnit 自定义注解

java - Android 上的 OpenCV 转换为灰度无法正常工作

java - 为什么 Spring Data 存储库方法参数名称在 Java 8 上也不可用?

android - 使用适用于 Android 的 Adob​​e Air Mobile 顺畅地调整 View 以响应设备方向

java - 相对路径 FileNotFoundException

android - 无法为 'dialog' 创建组件,原因 : java. awt.HeadlessException

java - Web 服务传输异常 : Not Found [404]

ubuntu - 在 Istio 中正确定义 mTLS 身份验证策略