首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何每X秒运行一次方法

如何每X秒运行一次方法
EN

Stack Overflow用户
提问于 2012-07-11 21:45:52
回答 9查看 194.3K关注 0票数 136

我正在开发一个Android2.3.3应用程序,我需要每隔X秒运行一次方法。

在iOS上,我用的是NSTimer,但在安卓上我不知道该用什么。

有人推荐我使用Handler;也有人推荐我使用AlarmManager,但我不知道哪种方法更适合NSTimer

这是我想在Android中实现的代码:

代码语言:javascript
复制
timer2 = [
    NSTimer scheduledTimerWithTimeInterval:(1.0f/20.0f)
    target:self
    selector:@selector(loopTask)
    userInfo:nil
    repeats:YES
];

timer1 = [
    NSTimer scheduledTimerWithTimeInterval:(1.0f/4.0f)
    target:self
    selector:@selector(isFree)
    userInfo:nil
    repeats:YES
];

我需要像NSTimer那样工作的东西。

你给我推荐什么?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-07-11 21:49:44

您将使用的解决方案实际上取决于每次执行函数之间需要等待多长时间。

如果您等待的时间超过10分钟,我建议您使用AlarmManager

代码语言:javascript
复制
// Some time when you want to run
Date when = new Date(System.currentTimeMillis());

try {
    Intent someIntent = new Intent(someContext, MyReceiver.class); // intent to be launched

    // Note: this could be getActivity if you want to launch an activity
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
        context,
        0, // id (optional)
        someIntent, // intent to launch
        PendingIntent.FLAG_CANCEL_CURRENT // PendingIntent flag
    );

    AlarmManager alarms = (AlarmManager) context.getSystemService(
        Context.ALARM_SERVICE
    );

    alarms.setRepeating(
        AlarmManager.RTC_WAKEUP,
        when.getTime(),
        AlarmManager.INTERVAL_FIFTEEN_MINUTES,
        pendingIntent
    );
} catch(Exception e) {
    e.printStackTrace();
}

一旦你广播了上面的Intent,你就可以通过实现一个BroadcastReceiver来接收你的Intent。请注意,这将需要在应用程序清单中或通过context.registerReceiver(receiver, intentFilter);方法注册。For more information on BroadcastReceiver's please refer to the official documentation.

代码语言:javascript
复制
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent)
    {
        System.out.println("MyReceiver: here!") // Do your work here
    }
}

如果您等待的时间少于10分钟,那么我建议您使用Handler

代码语言:javascript
复制
final Handler handler = new Handler();
final int delay = 1000; // 1000 milliseconds == 1 second

handler.postDelayed(new Runnable() {
    public void run() {
        System.out.println("myHandler: here!"); // Do your work here
        handler.postDelayed(this, delay);
    }
}, delay);
票数 188
EN

Stack Overflow用户

发布于 2012-07-11 21:48:44

使用计时器计时每一秒。

代码语言:javascript
复制
new Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        //your method
    }
}, 0, 1000);//put here time 1000 milliseconds=1 second
票数 117
EN

Stack Overflow用户

发布于 2016-10-15 18:40:40

您可以尝试使用此代码通过onResume()每隔15秒调用一次处理程序,并通过onPause()在活动不可见时停止它。

代码语言:javascript
复制
Handler handler = new Handler();
Runnable runnable;
int delay = 15*1000; //Delay for 15 seconds.  One second = 1000 milliseconds.


@Override
protected void onResume() {
   //start handler as activity become visible

    handler.postDelayed( runnable = new Runnable() {
        public void run() {
            //do something

            handler.postDelayed(runnable, delay);
        }
    }, delay);

    super.onResume();
}

// If onPause() is not included the threads will double up when you 
// reload the activity 

@Override
protected void onPause() {
    handler.removeCallbacks(runnable); //stop handler when activity not visible
    super.onPause();
}
票数 91
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11434056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档