Почему это не работает? Разве андроид не позволяет конструкторам? - PullRequest
0 голосов
/ 21 октября 2011

Мне интересно, почему этот код не работает.Это из-за конструктора?

import android.os.Bundle;
import android.view.Window;
import android.widget.TextView;
import android.content.Intent;
import android.app.Activity;
import java.util.Timer;
import java.util.TimerTask;

public class ClockMain extends Activity {

int Hours;
int Minutes;
int Seconds;

String TimeOfDayS;

TextView HoursMainV;
TextView MinutesMainV;
TextView SecondsMainV;
TextView TimeOfDayMainV;

Timer oneSecond;

public ClockMain(int Seconds) {
    // TODO Auto-generated constructor stub
    oneSecond = new Timer();
    oneSecond.schedule(new SecondsTask(), Seconds * 1000);

}
class SecondsTask extends TimerTask {
    public void run() {
        new ClockMain(1);
        ++Seconds;
        if(Seconds == 60){
            ++Minutes;
            Seconds = 0;
            if(Minutes == 60) {
                ++Hours;
                Minutes = 0;
                if(Hours == 12){
                    if(TimeOfDayS.equals("AM")) {
                        TimeOfDayS = "PM";
                    } else{
                        TimeOfDayS = "AM";
                    }
                    Hours= 0;
                }
            }
        }
        HoursMainV = (TextView) findViewById(R.id.HoursMainV);
        HoursMainV.setText(""+Hours);

        MinutesMainV = (TextView) findViewById(R.id.MinutesMainV);
        MinutesMainV.setText(":"+Minutes);

        SecondsMainV = (TextView) findViewById(R.id.SecondsMainV);
        SecondsMainV.setText(":"+Seconds);

        TimeOfDayMainV = (TextView) findViewById(R.id.TimeOfDayMainV);
        TimeOfDayMainV.setText(" "+TimeOfDayS);
    }
}
public void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.clock_main);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    Bundle extras = getIntent().getExtras();
        if (extras == null) {
            return;
        }
    int Hour = extras.getInt("HoursS");
    Hour = Hours;
    int Minute = extras.getInt("MinutesS");
    Minute = Minutes;
    int Second = extras.getInt("SecondsS");
    Second = Seconds;
    String TimeOfDaySs = extras.getString("TimeOfDayS");
    TimeOfDaySs = TimeOfDayS;
    HoursMainV = (TextView) findViewById(R.id.HoursMainV);
    HoursMainV.setText(""+Hour);

    MinutesMainV = (TextView) findViewById(R.id.MinutesMainV);
    MinutesMainV.setText(":"+Minute);

    SecondsMainV = (TextView) findViewById(R.id.SecondsMainV);
    SecondsMainV.setText(":"+Second);

    TimeOfDayMainV = (TextView) findViewById(R.id.TimeOfDayMainV);
    TimeOfDayMainV.setText(" "+TimeOfDaySs);
    new ClockMain(1);

}
  }

И да, я изменил Манифест, и я знаю, что с XML нет проблем.Он прекратил работать, когда я добавил общедоступную Clock Main и SecondsTask Class.Пожалуйста помоги.Если есть лучший способ сделать это специально для Android, я бы с удовольствием выучил его, или если я что-то упустил, я бы тоже хотел это знать.

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

Вместо передачи int seconds в конструкторе, вы должны пропустить его через Intent и onCreate() из Activity, а затем вы можете запустить и запланировать таймер для этого Activity.

onCreate() может рассматриваться как конструктор для Activity.

0 голосов
/ 21 октября 2011

Я думаю, проблема в представлениях, которые обновляются в вашем методе run () SecondsTask. TimerTask запускается в отдельном потоке. В андроиде только основной поток может обновлять интерфейс. Вы обновляете пользовательский интерфейс из рабочего потока. Поэтому удалите задачу обновления пользовательского интерфейса из этого метода запуска. Чтобы обновить пользовательский интерфейс, используйте обработчики или методы runOnUiThread ... Я надеюсь, что вы получили ответ ....

...