Timer(デーモンスレッド)について

496 views
Skip to first unread message

N やん

unread,
Sep 10, 2014, 8:58:14 PM9/10/14
to android-g...@googlegroups.com
Timerを使って定期実行したい処理があります。

ネットで調べると
Timer tim = new Timer(true);とするとデーモンスレッドになり
「デーモンスレッドが実行中でもプログラム(ユーザスレッド)が終了してしまえば、デーモンスレッドは強制的に終了されます」
という記載を見かけます。

こればActivityが終了すれば、Timerで処理しているスレッドも強制的に終了すると思ったのですが違うのでしょうか?

以下のように、Activityにボタンを一つ配置し、ボタン押下するとTimerを開始するようにしました。
開始ボタン押下しTimer処理を実行した状態で、HomeボタンなどでActivityを終了しonDestroyが呼ばれた後もTimer処理が動き続けます。
私のコードの書き方が悪いのでしょうか?デーモンスレッドの考え方が間違っているのでしょうか?
new Timer(); と new Timer(true); の違いと、違いがわかる具体的なコード例を教えていただけないでしょうか?

よろしくお願いいたします。

public class TestActivity extends Activity {

    private Button btnTimerStart;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        //タイマー開始ボタン
        this.btnTimerStart = (Button)this.findViewById(R.id.btnTimerStart);
        this.btnTimerStart.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {btnTimerStart_onClick(v);}});
    }
   
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Timer","onDestroy");
    }
   
    /*
     * タイマーで実行する処理 run
     */
    private void TimerTask_run(){
        Log.d("Timer","run_start");
        try {
            Thread.sleep(3000);    //3000ミリ秒Sleepする
        } catch (InterruptedException e) {       
        }
        Log.d("Timer","run_end");
    }
   
    /*
     * タイマー開始ボタン onClick
     */
    private void btnTimerStart_onClick(View v){
        Log.d("Timer","btnTimerStart_onClick");
        //タイマーで実行する処理
        TimerTask tsk = new TimerTask(){
            @Override
            public void run() {TimerTask_run();}};
        //タイマー開始
        this.timer = new Timer(true);
        timer.schedule(tsk, 0, 1000);
    }
}

Shigeo Mutoh

unread,
Sep 10, 2014, 11:31:27 PM9/10/14
to android-g...@googlegroups.com
武藤です。

Timer(boolean isDaemon)ですが、isDaemonがtrueかfalseによって
アプリ終了時にthreadが終了するまで待つか否かが決定されることに
なっているようです。

が、androidのプロセス管理を調べてみると面白いのでお勧めします
けども、とにかく表にいないプロセスは、しばらくの間は生かして
おいてもらえるけど、少し時間が経つと、threadが走っていようが
いまいが、必要であれば叩き殺されます。

なので、単にActivityだけが必要としていたTimerは、isDaemonがtrueか
falseに関わらず、Activity終了(onStopが理想)とともに停止させる
必要がある、なので悩むこともない、ということになります。

では。

N やん

unread,
Sep 11, 2014, 9:24:20 AM9/11/14
to android-g...@googlegroups.com
ありがとうございます。

たとえTimer(false)で実行したとしても、androidはthreadの終了を待ってくれないんですね。

androidの場合は悩まずに
Timer timer = new Timer();とし、onStopでtimer.cancel()するようにしておけばいいのですね。

ご教授ありがとうございました!
Reply all
Reply to author
Forward
0 new messages