任何人都可以告诉我,如果Android的setInterval / setTimeout存在等价物吗?有没有人有关于如何做的例子?
答案 0 :(得分:210)
与Android一样,有很多方法可以做到这一点,但假设你只想稍后在同一个线程上运行一段代码,我就用这个:
new android.os.Handler().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);
答案 1 :(得分:76)
<强>的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);
答案 2 :(得分:12)
根据您实际想要实现的目标,您应该看看Android处理程序:
http://developer.android.com/reference/android/os/Handler.html
如果您以前使用过javascript setTimeout()等来安排将来运行的任务,那么这就是Android的做法(postDelayed / sendMessageDelayed)。
请注意,处理程序或计时器都不会让Android手机从睡眠模式唤醒。换句话说,如果你想安排实际发生的事情,即使屏幕关闭/ cpu正在休眠,你也需要检查一下AlarmManager。
答案 3 :(得分:11)
如果您不担心将手机唤醒或将应用程序从死亡状态恢复,请尝试:
// 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.
hander.removeCallbacks(runnable);
答案 4 :(得分:5)
我对JavaScript知之甚少,但我认为Timers可能就是你想要的。
http://developer.android.com/reference/java/util/Timer.html
从链接:
一次性计划在绝对时间或相对延迟之后运行。重复任务按固定期限或固定费率安排。
答案 5 :(得分:4)
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();
}
}
答案 6 :(得分:3)
这是一个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();
答案 7 :(得分:3)
第一个答案肯定是正确的答案,而且是我基于这个lambda版本的,它的语法要短得多。由于Runnable只有1个覆盖方法&#34; run()&#34;,我们可以使用lambda:
this.m_someBoolFlag = false;
new android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);
答案 8 :(得分:2)
我正在为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);
}
以递归方式调用相同的方法
答案 9 :(得分:0)
科特琳:
您还可以使用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*/ }
答案 10 :(得分:0)
与 Android 一样,有很多方法可以做到这一点,但假设您只想在同一线程上运行一段代码,我使用这个:
new Timer().scheduleAtFixedRate(new TimerTask(){
@Override
public void run(){
Log.i("tag", "Hai Codemaker");
}
},0,1000);
此代码将每隔一秒记录一次 Hai Codemaker 文本。