Android / JavaのJavaScript setInterval / setTimeoutに相当するものは何ですか?


129

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

回答:


245

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

これは、引き出しの選択とfragmentTransactionのための非常に優れたソリューションです
ゴンサロ2015年

6
どうすればキャンセルできますか?
クエンティンロイ

run()メソッド内でアクティビティスコープを取得するにはどうすればよいですか?
アンディ

このような@Andy:MyActivityName.this.myFunctionOnActivity()
ベン・クレイトン

1
@QuentinRoy:Handler timeout = new Handler(); final Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);キャンセルする場合:timeout.removeCallbacks(r);
Bastian Springer

101

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

5
以下のためにscheduleAtFixedRateその活動が終了した後の方法、あなたはどのように活動中のタイマーをキャンセルするには?
オーロラニル2015

2
@ user824294タイマータスクを変数に保存し、スケジュールされたタスクを停止したいときに「cancel()」を呼び出すことができます-Timer t = new Timer(); t.scheduleAtFixedRate(...); -そして、t.cancel();を呼び出します。いつでも好きなときに。
Aebsubis 2017

14

スマートフォンを起こしたり、アプリを完全に元に戻したりすることに不安がない場合は、次のことを試してください。

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

私の電話(Huawei P Smart)では、ハンドラーはデバイスをスリープモードからウェイクアップしません(別の回答でapanlocoによって指摘されています
Franco

13

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

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

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

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


5

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

http://developer.android.com/reference/java/util/Timer.html

リンクから:

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


注:メイン/ UIスレッドではなく、バックグラウンドスレッドで呼び出されます。
2013年

これは答えではありませんが、OPソリューションが含まれている場合と含まれていない場合のある外部情報への参照です。OPが使用できる関連コードを貼り付けてください!
レフ

5

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

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

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

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
1.同様に、のonProgressUpdate()シミュレーションにも使用できますsetInterval()2. AsyncTaskスレッドプール(または単一のスレッド)で実行されるため別がAsyncTask終了するまで待機する必要がある場合があります。b。プールから1つのスレッドを使用します。
2013年

このコンテキストでの非同期タスクの使用には多くの問題があります(1つのスレッドのみと理由のないスレッドのロック)-他のソリューションの方がはるかに優れています。
エレメンタル

4

私はアンドロイド用の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);
}

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.