web-dev-qa-db-ja.com

AndroidのsetTimeOut()JavaScriptに相当するものは何ですか?

Android用のsetTimeOut(call function(),milliseconds);に相当するコードが必要です。

setTimeOut(call function(),milliseconds);

おそらくチェックアウトしたい TimerTask

これをもう一度取り上げたので、 Handler という別の推奨事項を作成します。ハンドラーはUIスレッドで作成されるか、コンストラクターでメインルーパーを使用して作成する限り、ハンドラーはUIスレッドに関連付けられるため、runOnUiThreadを明示的に呼び出す必要がないため、TimerTaskよりも簡単に使用できます。これは次のように機能します。

private Handler mHandler;
Runnable myTask = new Runnable() {
  @Override
  public void run() {
     //do work
     mHandler.postDelayed(this, 1000);
  }
}

@Override
public void onCreate(Bundle savedState) {
  super.onCreate(savedState);
  mHandler = new Handler(Looper.getMainLooper());
}
//just as an example, we'll start the task when the activity is started
@Override
public void onStart() { 
  super.onStart();
  mHandler.postDelayed(myTask, 1000);
}

//at some point in your program you will probably want the handler to stop (in onStop is a good place)
@Override
public void onStop() {
  super.onStop();
  mHandler.removeCallbacks(myTask);
}

アクティビティのハンドラーについて知っておくべきことがいくつかあります。

  1. OnStop(またはonResumeで開始した場合はonPause)でハンドラーを停止しないと、ハンドラーの実行中にアクティビティをシャットダウン/非表示にできます。これにより、UIを更新しようとすると問題が発生します。
  2. スマートフォンがディープスリープ状態になると、ハンドラは指定した頻度で起動しません。私はこれを知っています。何時間もの操作の後、Bluetoothデバイスを使用して接続をテストする広範なテストを行い、起動するたびにハンドラーをログ出力と共に使用していたためです。
  3. このタイマーを継続する必要がある場合は、アクティビティよりも長く続くサービスにタイマーを置くことをお勧めします。アクティビティをサービスに登録します(サービスと通信するためにサービスで定義されたインターフェースを実装することにより)。
21
Matt Wolfe

これは、現在のプロジェクトで使用したコードです。 Mattが言ったように、私はTimerTaskを使用しました。 60000はミリ秒です。 = 60秒。試合のスコアを更新するために使用しました。

private void refreshTimer() {
        autoUpdate = new Timer();
        autoUpdate.schedule(new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    public void run() {
                        adapter = Score.getScoreListAdapter(getApplicationContext());
                        adapter.forceReload();
                        setListAdapter(adapter);
                    }
                });
            }
        }, 0, 60000);
11
GiantRobot

nderscore-Java ライブラリにはsetTimeout()メソッドがあります。私はプロジェクトのメンテナーです。

コード例:

import com.github.underscore.lodash.U;
import com.github.underscore.Function;

public class Main {

    public static void main(String[] args) {
        final Integer[] counter = new Integer[] {0};
        Function<Void> incr = new Function<Void>() { public Void apply() {
            counter[0]++; return null; } };
        U.setTimeout(incr, 100);
    }
}

関数は新しいスレッドで100msで開始されます。

1

Javaアンダースコアを使用したValentyn回答の続きとして:

Gradleに依存関係を追加します。

dependencies {
    compile group: 'com.github.javadev', name: 'underscore', version: '1.15'
}

Java:

import com.github.underscore.lodash.$;

$.setTimeout(new Function<Void>() {
    public Void apply() {
        // work
        return null;
    }
}, 1000); // 1 second
1
noamtcohen