Xamarin.Android タイマ
タイマ

通常、Javaでは Java.Util.Timerが使用されているようですが、C#ってことで、.NET Frameworkのタイマを使用します。
.NETのタイマは、次の3種類がありますが、流石にWindows.Formsはアレなので、あとの2つを試してみます。
・Windowsタイマ(System.Windows.Forms.Timer)
・スレッド・タイマ(System.Threading.Time)
・サーバベース・タイマ(System.Timers.Timer)
サンプルは、タイマで1000msごとにコードバックメソッドを起動し、ボタンのテキストに時刻を表示しています。
スレッド・タイマ(System.Threading.Time)
System.Threading.Timeは、サーバベース・タイマより軽量であると説明されています。コールバックメソッドは、スレッド・プールにキューイングされて実行されるため、UIアクセスのために RunOnUiThread()を使用しています。
var button = FindViewById<Button>(Resource.Id.MyButton); //System.Threading.Timer(TimerCallback callback,Object state,int dueTime,int period) //callback コールバック関数 //state コールバックで使用される情報 //dueTime 開始までの遅延 (ミリ秒) //period インターバル (ミリ秒) var timer = new Timer((o) => RunOnUiThread(() =>{ button.Text = DateTime.Now.ToString("T"); }), null , 0, 1000);
コンストラクタで一通り設定できるので、結構シンプルに記述できます。
サーバベース・タイマ(System.Timers.Timer)
System.Timers.Timerは、サーバサイド・アプリケーションで使用されているもので、より正確な間隔で実行されるとありますが、Android上で使用して果たしてどうなんでしょうね・・・スレッド・タイマとちょっと使い方は違いますが、やってることはほぼ同じです。
こちらもコールバックメソッドはスレッドプールで実行されるため、RunOnUiThread()を使用してUIにアクセスしています。
※サーバベース・タイマでは、コールバックでUIに直接アクセスするコードを書いても例外が発生せず、ただUIが変化しないだけなので、嵌らないように注意してください。
var button = FindViewById<Button>(Resource.Id.MyButton); //System.Timers.Timer var timer = new Timer(); timer.Elapsed += (sender, args) => RunOnUiThread(() => { //コールバック button.Text = DateTime.Now.ToString("T"); }); timer.Interval = 1000; // インターバル timer.AutoReset = true; // false:最初の1回だけ実行 //timer.Enabled = true; // timer.Start()と同じ timer.Start();