Androidアプリ タイマとハンドラ
投稿日: | |
---|---|
タグ: |
本稿はAndroidアプリ開発でjava.util.Timerを使った際のメモである.
Android APIとタイマ
Javaではタイマ(java.util.Timer)を使って一定時間毎に特定の処理を行うことができる.しかしタイマ内で,直接アクティビティ内のウィジェットの情報を書き換えることはできない(私の環境では何故かProgressBarは上手くいったが…).このようなコードはコンパイル可能だが,タイマ内の処理でウィジェットの値を書き換えようとした瞬間,アプリがエラー終了する.これを解決するには,android.os.Handlerのインスタンスを使用すれば良い.これを含め,タイマには次の4つのクラスを使用する.
- java.util.Timer
- java.util.TimerTask
- android.os.Handler
- java.lang.Runnable
java.util.Timer
はじめにjava.util.Timerを使ったサンプルを紹介する.
class Hoge {
private java.util.Timer timer;
private class MyTimerTask implements java.util.TimerTask{
int time_cnt = 0;
@Override
public void run()
{
time_cnt++;
System.out.println(time_cnt);
if (time_cnt==10){
timer.cancel();
}
}
}
Hoge()
{
timer = new java.util.Timer(true);
MyTimerTask ttask = new MyTimerTask();
timer.schedule(ttask, 60000, 60000);
}
}
java.util.Timerのインスタンスはschedule関数を使用して,ある処理を定期的に実行できる.scheduleの引数はそれぞれ次の通りである.
schedule(java.util.TimerTaskのインスタンス, 最初に実行されるまでの時間, どれぐらい間を置いて実行するか)
時間はミリ秒単位で指定する.
java.util.Timerのインスタンスはcancelを呼び出すことで終了する.
timer.cancel();
終了したタイマはもう一度scheudleを呼び出しても起動できず,再度処理を行うには新たにインスタンスを生成しなければならない.
java.util.Timerとandroid.os.Handler.
以下に実際のサンプルコードを示す.
public class MainActivity extends android.app.Activity {
private android.widget.TextView text;
private java.util.Timer timer;
private final android.os.Handler HANDLER = new android.os.Handler();
private class MyRunnable extends java.lang.Runnable {
private Integer time_cnt = 0;
@Override
public void run()
{
time_cnt++;
text.setText(time_cnt.toString());
if (time_cnt==10){
timer.cancel();
finish(); // アクティビティの終了
}
}
}
private class MyTimerTask extends java.util.TimerTask{
MyRunnable RUNNABLE = new MyRunnable();
@Override
public void run()
{
HANDLER.post(RUNNABLE);
}
}
protected void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = new java.util.Timer(true);
MyTimerTask ttask = new MyTimerTask();
timer.schedule(ttask, 60000, 60000);
}
}
このようにMyTimerTaskクラスのrun関数で,android.os.handlerインスタンスのpost関数を呼び出し,引数にjava.lang.Runnable(あるいはそれを継承した)クラスのインスタンスを与える.これにより,定期的にRunnable(あるいはそれを継承した)クラスのインスタンスのrun()が呼び出される.