SetInterval/setTimeoutに相当するものがAndroidに存在するかどうかを教えてもらえますか?誰かがそれを行う方法についての例を持っていますか?
いつものように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);
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);
実際に達成したいものに応じて、Androidハンドラーを確認する必要があります。
http://developer.Android.com/reference/Android/os/Handler.html
以前にjavascript setTimeout()などを使用してタスクを将来実行するようにスケジュールした場合、これはAndroidの方法です(postDelayed/sendMessageDelayed)。
ハンドラもタイマーもAndroid電話をスリープモードから復帰させないことに注意してください。つまり、画面がオフになっている/ CPUがスリープしているにもかかわらず、実際に何かが起こるようにスケジュールする場合は、AlarmManagerもチェックアウトする必要があります。
スマートフォンを起動したり、アプリを死から復活させたりすることを心配していない場合は、以下を試してください。
// 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);
JavaScriptについてはあまり知りませんが、タイマーはあなたが探しているものかもしれません。
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();
}
}
最初の答えは間違いなく正しい答えであり、このラムダバージョンの基になったものであり、構文がはるかに短くなっています。 Runnableにはオーバーライドメソッド "run()"が1つしかないため、ラムダを使用できます。
this.m_someBoolFlag = false;
new Android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);
これは同等の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();
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);
}
同じメソッドを再帰的に呼び出す