Простое напоминание для Android - PullRequest
1 голос
/ 27 мая 2010

Я пытаюсь сделать простой таймер.

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);
                }
            }
        });

    }
}

Каждый раз, когда я нажимаю переключатель, таймер должен запускаться, верно? Но почему это не начинается?

1 Ответ

1 голос
/ 27 мая 2010

Во-первых, вы не можете изменить пользовательский интерфейс из фонового потока. Таким образом, вы не можете изменить пользовательский интерфейс с TimerTask.

Во-вторых, даже если ваш "БУМ!" логика была в главном потоке приложений, вы не позволяете Android ничего делать. Пользовательский интерфейс Android управляется сообщениями и событиями. Когда вы звоните setText() и setVisibility(), они не вступают в силу, пока вы не вернете управление Android. Следовательно, в вашем случае вы ничего не увидите, поскольку TextView станет невидимым сразу после того, как станет видимым.

В-третьих, если вы переместите свой код в основной поток приложения, не блокируйте этот поток, например, с помощью вызова wait().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...