Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么ScheduledExecutorService.schedule(Runnable r、Long delay、TimeUnit t)会忽略延迟并立即运行?_Android_Scheduledexecutorservice - Fatal编程技术网

Android 为什么ScheduledExecutorService.schedule(Runnable r、Long delay、TimeUnit t)会忽略延迟并立即运行?

Android 为什么ScheduledExecutorService.schedule(Runnable r、Long delay、TimeUnit t)会忽略延迟并立即运行?,android,scheduledexecutorservice,Android,Scheduledexecutorservice,我有一个ScheduledExecutorService,我想用它来计划一个具有一定延迟的Runnable的执行。然而,当我调用它的schedule方法时,延迟被完全忽略,Runnable被立即执行。这是我的代码: 我的ScheduledExecutorService构造函数: private static ScheduledExecutorService existQueuePool = Executors.newScheduledThreadPool(1); 这是对其调度方法的调用

我有一个ScheduledExecutorService,我想用它来计划一个具有一定延迟的Runnable的执行。然而,当我调用它的schedule方法时,延迟被完全忽略,Runnable被立即执行。这是我的代码:

我的ScheduledExecutorService构造函数:

    private static ScheduledExecutorService existQueuePool = Executors.newScheduledThreadPool(1);
这是对其调度方法的调用(由日志包围):

Log.d(标记“计划前”);
ScheduledFuture msScheduledFuture=existQueuePool.schedule(新的可运行(){
@凌驾
公开募捐{
d(标记“为existQueuePool中的现有消息设置clearMessageTask”);
clearMessageTask(mContext.getString(R.string.existType));
}
},1000L,时间单位为毫秒);
日志d(标签“计划表后”);
日志让我看到,“计划前”和“设置清除…”之间只有20-30毫秒的延迟,而不是我预期的1000毫秒

有关计划方法的文档如下所示:

创建并执行在给定延迟后启用的一次性操作

在这种情况下,“启用”一词的确切含义是什么

任何帮助都将不胜感激

编辑:即使使用长代码(1000L),代码似乎也会立即执行


我想你是对的。尝试
1000L
,因为需要
long
值,而不是
int

编辑:我自己尝试过,你的代码对我有效:

package testdelay;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class TestDelay {

    private static final ScheduledExecutorService existQueuePool = Executors.newScheduledThreadPool(1);
    private static long start;
    private static long end;
    public static void main(String[] args) {
        start = System.currentTimeMillis();
        System.out.println("Before execution: " + start);
        ScheduledFuture<?> mScheduledFuture = existQueuePool.schedule(new Runnable() {
                    @Override
                    public void run() {
                        end = System.currentTimeMillis();
                        System.out.println("Executed at: " + end);
                        System.out.println("Executed after delay of : " + (end - start) + " ms.");
                    }
                }, 1000L, TimeUnit.MILLISECONDS);
    }
}

它似乎是即时运行的,因为您在runnable之外记录了一条消息,而runnable在提交到服务之后立即执行。您应该将它记录在runnable中,以查看它何时运行。

我的错,我传递了一个类型为
Long
的变量,但是当我发布一个简化的代码片段时,我忘记了包含
1000L
。它仍然不起作用。您知道文档中“启用”的确切含义吗?
package testdelay;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class TestDelay {

    private static final ScheduledExecutorService existQueuePool = Executors.newScheduledThreadPool(1);
    private static long start;
    private static long end;
    public static void main(String[] args) {
        start = System.currentTimeMillis();
        System.out.println("Before execution: " + start);
        ScheduledFuture<?> mScheduledFuture = existQueuePool.schedule(new Runnable() {
                    @Override
                    public void run() {
                        end = System.currentTimeMillis();
                        System.out.println("Executed at: " + end);
                        System.out.println("Executed after delay of : " + (end - start) + " ms.");
                    }
                }, 1000L, TimeUnit.MILLISECONDS);
    }
}
Before execution: 1386350613147
Executed at: 1386350614149
Executed after delay of : 1002 ms.