使用postDelayed在特定时间运行任务

TJ1*_*TJ1 3 android runnable postdelayed

我想在特定时间开始一项任务.为此,我使用runnablepostDelayed方法如下:

private Runnable mLaunchTask = new Runnable() {
        public void run() {

            try {
                MY TASK
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
};
Run Code Online (Sandbox Code Playgroud)

在我的代码中我使用mLunchTask如下:

mHandler = new Handler();
mHandler.postDelayed(mLaunchTask, myDelay*1000); 
Run Code Online (Sandbox Code Playgroud)

myDelay计算如下:

s  = DateFormat.format("hh:mm:ss aaa", d.getTime());
cTime = s.toString(); // current Time
ch = Integer.parseInt(cTime.substring(0,2)); // current hour
cm = Integer.parseInt(cTime.substring(3,5)); // current minute
cs = Integer.parseInt(cTime.substring(6,8)); // current second
if (cTime.substring(9,11).equalsIgnoreCase("pm") && (ch<12) ) ch = ch+12; 
myDelay=(desiredHour-ch)*3600+(desiredMinute-cm)*60 - cs;
if (myDelay<0) myDelay = 0;
Run Code Online (Sandbox Code Playgroud)

desiredHour,desiredMinute由用户设置.人们期望,MY TASK开始于desiredHourdesiredMinute0秒.然而,"我的任务开始时有几秒延迟,看起来像是随机的.

基于上面的代码,是否有任何理由不能在确切的期望时间开始?

谢谢

sce*_*sor 5

首先,您的延迟计算是正确的,但"pm"检测不适用于其他语言.使用日历来获得延迟要好得多:

Calendar calendar = Calendar.getInstance();
long currentTimestamp = calendar.getTimeInMillis();
calendar.set(Calendar.HOUR_OF_DAY, desiredHour);
calendar.set(Calendar.MINUTE, desiredMinute);
calendar.set(Calendar.SECOND, 0);
long diffTimestamp = calendar.getTimeInMillis() - currentTimestamp;
long myDelay = (diffTimestamp < 0 ? 0 : diffTimestamp);
Run Code Online (Sandbox Code Playgroud)

现在你有毫秒的延迟并且可以启动处理程序:

new Handler().postDelayed(mLaunchTask, myDelay);
Run Code Online (Sandbox Code Playgroud)

在我的测试中,以下可运行的日志在所需的时间没有延迟.

private Runnable mLaunchTask = new Runnable() {
    public void run() {
        Calendar calendar = Calendar.getInstance();
        Log.d("test", "started at " 
            + calendar.get(Calendar.HOUR_OF_DAY) + " " 
            + calendar.get(Calendar.MINUTE) + " "
            + calendar.get(Calendar.SECOND)
        );
    }
};
Run Code Online (Sandbox Code Playgroud)

也许您的启动任务需要几秒钟才能加载?

请问AlarmManager是一种替代?