web-dev-qa-db-ja.com

Android / JavaのJavaScript setInterval / setTimeoutと同等のものは何ですか?

SetInterval/setTimeoutに相当するものがAndroidに存在するかどうかを教えてもらえますか?誰かがそれを行う方法についての例を持っていますか?

110
karse23

いつものように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);
217
Ben Clayton

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);
82
Midhun

実際に達成したいものに応じて、Androidハンドラーを確認する必要があります。

http://developer.Android.com/reference/Android/os/Handler.html

以前にjavascript setTimeout()などを使用してタスクを将来実行するようにスケジュールした場合、これはAndroidの方法です(postDelayed/sendMessageDelayed)。

ハンドラもタイマーもAndroid電話をスリープモードから復帰させないことに注意してください。つまり、画面がオフになっている/ CPUがスリープしているにもかかわらず、実際に何かが起こるようにスケジュールする場合は、AlarmManagerもチェックアウトする必要があります。

12
apanloco

スマートフォンを起動したり、アプリを死から復活させたりすることを心配していない場合は、以下を試してください。

// 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);
11
SharkAlley

JavaScriptについてはあまり知りませんが、タイマーはあなたが探しているものかもしれません。

http://developer.Android.com/reference/Java/util/Timer.html

リンクから:

ワンショットは、絶対時間または相対的な遅延の後に実行されるようにスケジュールされます。定期的なタスクは、固定期間または固定レートでスケジュールされます。

5
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();
    }
}
4
Jeeva

最初の答えは間違いなく正しい答えであり、このラムダバージョンの基になったものであり、構文がはるかに短くなっています。 Runnableにはオーバーライドメソッド "run()"が1つしかないため、ラムダを使用できます。

this.m_someBoolFlag = false;
new Android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);
3
neoRiley

これは同等の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();
3
Stephane JAIS

Android用のmp3プレーヤーを作成していました。現在の時間を500msごとに更新したかったので、このようにしました

setInterval

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);
}

同じメソッドを再帰的に呼び出す

2
Jeeva