【发布时间】:2011-06-16 14:51:06
【问题描述】:
谁能告诉我是否存在适用于 Android 的 setInterval/setTimeout 等价物?有没有人可以举个例子说明一下?
【问题讨论】:
标签: java javascript android settimeout
谁能告诉我是否存在适用于 Android 的 setInterval/setTimeout 等价物?有没有人可以举个例子说明一下?
【问题讨论】:
标签: java javascript android settimeout
与往常一样,Android 有很多方法可以做到这一点,但假设您只是想稍后在同一个线程上运行一段代码,我使用这个:
new android.os.Handler(Looper.getMainLooper()).postDelayed(
new Runnable() {
public void run() {
Log.i("tag", "This'll run 300 milliseconds later");
}
},
300);
.. 这几乎等同于
setTimeout(
function() {
console.log("This will run 300 milliseconds later");
},
300);
【讨论】:
MyActivityName.this.myFunctionOnActivity()
Handler timeout = new Handler(); final Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);,如果你想取消它:timeout.removeCallbacks(r);
setInterval()
每n毫秒重复一次的函数
Javascript
setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);
近似java等价
new Timer().scheduleAtFixedRate(new TimerTask(){
@Override
public void run(){
Log.i("tag", "A Kiss every 5 seconds");
}
},0,5000);
setTimeout()
仅在 n 毫秒后起作用的函数
Javascript
setTimeout(function(){ Console.log("A Kiss after 5 seconds"); },5000);
近似java等价
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
Log.i("tag","A Kiss after 5 seconds");
}
}, 5000);
【讨论】:
scheduleAtFixedRate 方法,一旦活动完成,如何取消活动内的计时器?
如果您不担心唤醒手机或让您的应用起死回生,请尝试:
// Param is optional, to run task on UI thread.
Handler handler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
@Override
public void run() {
// Do the task...
handler.postDelayed(this, milliseconds) // Optional, to repeat the task.
}
};
handler.postDelayed(runnable, milliseconds);
// Stop a repeating task like this.
handler.removeCallbacks(runnable);
【讨论】:
根据您实际想要实现的目标,您应该看看 Android Handlers:
http://developer.android.com/reference/android/os/Handler.html
如果您之前使用 javascript setTimeout() 等来安排将来运行的任务,这是 Android 的执行方式(postDelayed / sendMessageDelayed)。
请注意,处理程序或计时器都不会使 Android 手机从睡眠模式中唤醒。换句话说,如果你想安排一些事情在屏幕关闭/cpu 处于休眠状态时实际发生,你也需要检查 AlarmManager。
【讨论】:
第一个答案绝对是正确的答案,也是我基于这个 lambda 版本的基础,它的语法要短得多。由于 Runnable 只有 1 个覆盖方法“run()”,我们可以使用 lambda:
this.m_someBoolFlag = false;
new android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);
【讨论】:
我对 JavaScript 了解不多,但我认为 Timers 可能是您正在寻找的东西。
http://developer.android.com/reference/java/util/Timer.html
来自链接:
一次性计划在绝对时间或相对延迟后运行。周期性任务按固定周期或固定速率安排。
【讨论】:
import java.util.Timer;
import java.util.TimerTask;
class Clock {
private Timer mTimer = new Timer();
private int mSecondsPassed = 0;
private TimerTask mTask = new TimerTask() {
@Override
public void run() {
mSecondsPassed++;
System.out.println("Seconds passed: " + mSecondsPassed);
}
};
private void start() {
mTimer.scheduleAtFixedRate(mTask, 1000, 1000);
}
public static void main(String[] args) {
Clock c = new Clock();
c.start();
}
}
【讨论】:
我正在为 android 创建一个 mp3 播放器,我想每 500ms 更新一次当前时间,所以我这样做了
private void update() {
new android.os.Handler().postDelayed(new Runnable() {
@Override
public void run() {
long cur = player.getCurrentPosition();
long dur = player.getDuration();
currentTime = millisecondsToTime(cur);
currentTimeView.setText(currentTime);
if (cur < dur) {
updatePlayer();
}
// update seekbar
seekBar.setProgress( (int) Math.round((float)cur / (float)dur * 100f));
}
}, 500);
}
递归调用同一个方法
【讨论】:
这是一个等效的 setTimeout,在尝试更新用户界面时非常有用 延迟之后。
您可能知道,更新用户界面只能通过 UI 线程来完成。 AsyncTask 通过从该线程调用其 onPostExecute 方法来为您完成此操作。
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// Update the User Interface
}
}.execute();
【讨论】:
onProgressUpdate()也可以用来模拟setInterval()。 2. AsyncTask 在线程池(或仅单个线程)上运行,因此 a. 它可能必须等到另一个 AsyncTask 完成; b。它将占用池中的一个线程。
与 Android 一样,有很多方法可以做到这一点,但假设您只是想在同一个线程上运行一段代码,我使用这个:
new Timer().scheduleAtFixedRate(new TimerTask(){
@Override
public void run(){
Log.i("tag", "Hai Codemaker");
}
},0,1000);
此代码将每隔一秒记录一次 Hai Codemaker 文本。
【讨论】:
科特林:
您也可以使用 CountDownTimer:
class Timer {
companion object {
@JvmStatic
fun call(ms: Long, f: () -> Unit) {
object : CountDownTimer(ms,ms){
override fun onFinish() { f() }
override fun onTick(millisUntilFinished: Long) {}
}.start()
}
}
}
在你的代码中:
Timer.call(5000) { /*Whatever you want to execute after 5000 ms*/ }
【讨论】: