2012-01-07 20 views

答えて

21

あなたは私がHandlerある別の勧告を、したいのですが、再びこれを育てているのでおそらくTimerTask

をチェックアウトしたいです。 runOnUiThreadを明示的に呼び出す必要がないので、TimerTaskよりも使用する方が簡単です。ハンドラがUIスレッドで作成されているか、そのコンストラクタにメインルーパを使用して作成されている限り、UIスレッドに関連付けられます。それはこのように動作します:

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. このタイマーが進行中である必要がある場合は、アクティビティより長く続くサービスに入れることをおすすめします。あなたの活動をサービスに登録する(サービスと通信するためのサービスで定義されたインターフェースを実装することによって)。
+0

リンクが機能していません。 – laarsk

+1

あなたのためにそれを修正しました。 –

+0

ありがとうございました! :) – laarsk

11

これは私の現在のプロジェクトで使用したコードです。 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); 
+0

それは動作しません。自動更新とはどういう意味ですか?およびrunOnUiThread。マイナス – l0gg3r

+3

これらの質問はほとんど関係ありません、l0gg3r。彼は、UIスレッド上で、60秒後に実行する予定のタスクの例を挙げました。どのAndroid開発者もコードを理解しやすいはずです。 –

+0

ただし、@GiantRobot。この例は、setTimeoutよりsetIntervalのように動作します。このコードをsetTimeoutに使用するために必要な変更は、値の順序を変更(60000、0の代わりに0,60000)し、run()関数でタイマーを停止して1回だけ実行します。 –

1

underscore-javaライブラリにsetTimeout()メソッドがあります。

コード例:

import com.github.underscore.lodash.$; 
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; } }; 
     $.setTimeout(incr, 100); 
    } 
} 

関数は、新しいスレッドと100ミリ秒に開始されます。 Javaのアンダースコアを使用してValentynの答えに継続として

1

Gradleのために、依存関係を追加します。

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

のJava:http://stackoverflow.com/qの

import com.github.underscore.lodash.$; 

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