2011-01-23 11 views
3

私は最近これについて非常に混乱しており、どこでも答えを見つけることができません。N秒ごとにTextViewを更新しますか?

アンドロイド用のプログラミングでは、10秒ごとにテキストビューを更新したいと思いますが、どうすればいいですか?私はいくつかのサンプルが "Run()"と "Update()"を使用しているのを見たことがあります。

は、今私が持っている:

public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.slideshow); CONST_TIME = (int) System.currentTimeMillis(); Resources res = getResources(); myString = res.getStringArray(R.array.myArray); } public void checkTime(View V){ TextView text = (TextView) findViewById(R.id.fadequote); CUR_TIME = (int) System.currentTimeMillis(); text.setText(""+(int) (CUR_TIME-CONST_TIME));//Debugs how much time has gone by if(CUR_TIME-CONST_TIME>10000){ getNextQuote(null); //A function that gets a random quote CONST_TIME = CUR_TIME; } }

私は私が本当に求めているものを推測するが、どのように私はcheckTimeは()onPauseまで延々とそれ自己を繰り返して作るのですか()が呼ばれているのですか?

答えて

10

タイマーの使用はどうですか?

private Timer timer = new Timer(); 
private TimerTask timerTask; 
timerTask = new TimerTask() { 
@Override 
public void run() { 
    //refresh your textview 
} 
}; 
timer.schedule(timerTask, 0, 10000); 

timer.cancel()でキャンセルします。 run()メソッドでは、runOnUiThread()を使用できます。

UPDATE:

私はそれを30秒ごとに更新するには、このタイマーを使用していますlivescoringアプリを持っています。それは次のようになります。

private Timer timer; 
private TimerTask timerTask; 

public void onPause(){ 
    super.onPause(); 
    timer.cancel(); 
} 

public void onResume(){ 
    super.onResume(); 
    try { 
     timer = new Timer(); 
     timerTask = new TimerTask() { 
      @Override 
      public void run() { 
     //Download file here and refresh 
      } 
     }; 
    timer.schedule(timerTask, 30000, 30000); 
    } catch (IllegalStateException e){ 
     android.util.Log.i("Damn", "resume error"); 
    } 
} 
+0

を発見したわけではありません。 timer.schedule(tiemrTask、0,10000); "私のクラスのすぐ下に置くか、onResume();の下に置く必要がありますか?私はクラスに入れるとエラーになるので、 – QQWW1

+0

私の投稿を更新しました。あなたはどうしますか?(LogCatの出力) – Rainer

+0

だから、私は正確に(「//ここでファイルをダウンロードしてリフレッシュする」の代わりに)「getNextQuote(null)」を実行して配列から引用符をランダムに探し出し、新しい見積もりがありますが、それは一度だけではなく、連続しています。私はTimertaskを10に設定しています(LogCatのエラーもありません) – QQWW1

0

スレッドを使用してください。 Painless Threadingを参照してください。

+0

:私は「TimerTaskを=新しいTimerTaskを(){...}を置けばいい – 030

15

よりもむしろ大騒ぎバックグラウンドスレッドで、次いでrunOnUiThread()Runnableをスケジュールするために、任意のViewで利用可能postDelayed()を使用します。そのRunnableはあなたのTextViewを更新し、次のパスのためにそれ自身をスケジュールすることができます。タイムティックを見るためにバックグラウンドスレッドを使用することは無駄です。

+0

リストビュー項目を更新するときにこのメカニズムをどのように使用しますか?ビューが再利用される可能性がある場合、以前スケジュールされた実行可能ファイルを削除する必要があります。投稿された実行可能ファイルをどのように削除しますか? – 500865

+1

@ 500865: "投稿された実行可能ファイルをどうやって削除しますか?" - removeCallbacks()を呼び出す。 – CommonsWare

+0

ありがとう@CommonsWare。私はViewクラスのそのメソッドに気付かなかった。それはうまくいくはずです。 – 500865

5

それは、誰かがここで助け包みはpostDelayed()

...

private Handler mHandler = new Handler(); 

...

// call updateTask after 10seconds 
mHandler.postDelayed(updateTask, 10000); 

...

private Runnable updateTask = new Runnable() { 
    public void run() { 
     Log.d(getString(R.string.app_name) + " ChatList.updateTask()", 
       "updateTask run!"); 

        // run any code here...   

        // queue the task to run again in 15 seconds... 
        mHandler.postDelayed(updateTask, 15000); 


    } 
}; 
8

Iを使用したサンプルコードですWired00に同意する答えが、この順に従ってください:404にリンク結果をクリックする

 //update current time view after every 1 seconds 
     final Handler handler=new Handler(); 

     final Runnable updateTask=new Runnable() { 
      @Override 
      public void run() { 
       updateCurrentTime(); 
       handler.postDelayed(this,1000); 
      } 
     }; 

     handler.postDelayed(updateTask,1000); 
関連する問題