SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Xamarin.Android タイマ

【 Xamarin 記事一覧 】


タイマ

通常、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();

【 Xamarin 記事一覧 】