tags:

views:

283

answers:

1

I'm trying to make a simple timer.

package com.anta40.reminder;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.widget.RadioGroup;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TabHost.TabSpec;

public class Reminder extends Activity{

    public final int TIMER_DELAY = 1000;
    public final int TIMER_ONE_MINUTE = 60000; 
    public final int TIMER_ONE_SECOND = 1000;
    Timer timer;
    TimerTask task;
    TextView tv;

    @Override
    public void onCreate(Bundle icicle) {

        super.onCreate(icicle);
        setContentView(R.layout.main);
        timer = new Timer();

        task = new TimerTask() {

            @Override
            public void run() {
                tv = (TextView) findViewById(R.id.textview1);
                tv.setText("BOOM!!!!");
                tv.setVisibility(TextView.VISIBLE);
                try {
                    this.wait(TIMER_DELAY);
                }
                catch (InterruptedException e){

                }
                tv.setVisibility(TextView.INVISIBLE);
            }

        };

        TabHost tabs=(TabHost)findViewById(R.id.tabhost);

        tabs.setup();

        TabSpec spec = tabs.newTabSpec("tag1");

        spec.setContent(R.id.tab1);
        spec.setIndicator("Clock");
        tabs.addTab(spec);

        spec=tabs.newTabSpec("tag2");
        spec.setContent(R.id.tab2);
        spec.setIndicator("Settings");
        tabs.addTab(spec);

        tabs.setCurrentTab(0);

        RadioGroup rgroup = (RadioGroup) findViewById(R.id.rgroup);
        rgroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                if (checkedId == R.id.om){
                    timer.schedule(task, TIMER_DELAY, 3*TIMER_ONE_SECOND);
                }
                else if (checkedId == R.id.twm){
                    timer.schedule(task, TIMER_DELAY, 6*TIMER_ONE_SECOND);
                }
                else if (checkedId == R.id.thm){
                    timer.schedule(task, TIMER_DELAY, 9*TIMER_ONE_SECOND);
                }
            }
        });

    }
}

Each time I click a radio button, the timer should start, right? But why it doesn't start?

+1  A: 

First, you cannot modify the UI from a background thread. So you cannot modify the UI from a TimerTask.

Second, even if your "BOOM!" logic were on the main application thread, you are not allowing Android to do anything. Android's UI is message- and event-driven. When you call setText() and setVisibility(), they do not take effect until you return control to Android. Hence, in your case, you would not see anything, since the TextView would become invisible immediately after becoming visible.

Third, if you do move your code to the main application thread, do not block that thread, such as with your wait() call.

CommonsWare
>> they do not take effect until you return control to AndroidThen how can I return it?>> Third, if you do move your code to the main application thread, do not block that thread, such as with your wait() call.After the given interval, I want the textview "Boom" to be invisible. Hence, the wait(). I don't know better solution at the moment.
anta40
"Then how can I return it?" By returning (i.e., exiting whatever callback you are in). "After the given interval, I want the textview "Boom" to be invisible. Hence, the wait(). I don't know better solution at the moment." Use `postDelayed()` on View or Handler to schedule a `Runnable` to run after your desired delay period, and make the `TextView` invisible in the `run()` method of the `Runnable`.
CommonsWare