Metoda TimeUnit

0

Witajcie,
Bawię się troszeczkę w odliczanie czasu w javie i próbuję zrozumieć jedną rzecz. Oczywiście wszystko mi działa ale nie rozumiem jak to dokładnie jest formatowane. Mam takie trzy linijki:

TimeUnit.MILLISECONDS.toHours(milllis),
TimeUnit.MILLISECONDS.toMinutes(milllis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milllis)),
TimeUnit.MILLISECONDS.toSeconds(milllis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milllis))

One formatują mi stringa który odpowiada za wyświetlanie odliczanego czasu. Pierwsza linijka to formatuje mi wyświetlanie godzin, druga minut, trzecia sekund. Ale nie potrafię zrozumieć czemu w drugiej i trzeciej odejmowane są jeszcze jakieś inne wartości. Przepraszam za infantylne pytanie jeśli kogoś ono uraziło ale nie chcę nic klepać bez sensu tylko chcę rozumieć to co piszę i skąd to się wzięło.

0

Bo inaczej zamiast godziny np. 1:20:10 byś miał 1:80:4810 (przy założeniu, że metody zwracają inty) - nie chcesz przecież wyświetlić wszystkich minut / sekund, tylko te, które nie tworzą pełnych godzin / minut.

0

Tak tak, to wiem bo już testowałem bez tego odejmowania ale nie potrafię zrozumieć czemu tak się dzieje i jak to wygląda np na liczbach, co odejmuję od czego na konkretnym przykładzie.

0

Najprostszy przykład:

sekundy = 80

- ile jest pełnych godzin?   ->            0
                                           ↓
- ile zostało pełnych minut? ->        1 - 0 * 60 = 1    // * 60 bo tyle minut ma godzina
                                       ↓
- ile zostało sekund?        ->   80 - 1 * 60 = 20       // * 60 bo tyle sekund ma minuta

Godzina: 00:01:20

Mam nadzieję, że masz 12 lat ;)

0

Oki, wszystko jasne. A czy mogę mieć do Was jeszcze jedną prośbę? Chodzi o pomoc w zrozumieniu kodu odpowiadającego za mój zegar odmierzający czas. Oczywiście wszystko działa, część rzeczy rozumiem jak działają ale paru niestety nie. Poniżej wklejam kod i napiszę w nim komentarze tego co rozumiem i tego czego nie rozumiem. Jeśli gdzieś się pomyliłem to również proszę o poprawienie.

public class app extends AppCompatActivity {
    public static Button start; //inicjuję przycisk
    private static TextView timer;  // inicjuję pole typu texView
    Counter time = new Counter(2700000, 1000); //tego właśnie nie rozumiem, wydaje m się że tu inicjuję swój licznik odmierzający czas ilością milisekund od ilu ma mi odmierzać i co ile czyli interwał czasowy. 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_singles_carrom);
        start = (Button) findViewById(R.id.start);
        timer = (TextView) findViewById(R.id.timer);
        timer.setText("00:45:00");


        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                time.start(); //tu startuję przyciskiem odmierzanie czasu
            }
        });

    }
    public class Counter extends CountDownTimer { //tworzę klasę Counter które dziedziczy po CountDownTimer
        public Counter(long miliseconds, long interval) { //tych dwóch linijek poniżej właśnie nie rozumiem. 
            super(miliseconds, interval);

        }

        @Override
        public void onTick(long millisUntilFinished) { //w tej metodzie formatuję sobie swój timer
            long milllis = millisUntilFinished;
            String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(milllis),
                    TimeUnit.MILLISECONDS.toMinutes(milllis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milllis)),
                    TimeUnit.MILLISECONDS.toSeconds(milllis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milllis)));
            timer.setText(hms);
        }

        @Override
        public void onFinish() { //tu mogę wstawić instrukcje co ma się stać gdy licznik zakończy odliczanie. 

        }
    }
}

0
 public Counter(long miliseconds, long interval) { //tych dwóch linijek poniżej właśnie nie rozumiem. 
            super(miliseconds, interval);
 
        }

Kontruktor Twojej klasy z wywołałem konstruktora z nadklasy. W tym przypadku CountDownTimer. I dzięki temu konstruktorowi możesz wykonać to:

 Counter time = new Counter(2700000, 1000); 
0
        public Counter(long miliseconds, long interval) { //tych dwóch linijek poniżej właśnie nie rozumiem. 
            super(miliseconds, interval); //**
 
        }

W wierszu z gwiazdkami wywołujesz konstruktor klasy bazowej (CountDownTimer). Z nazwy parametrów zgaduję, że miliseconds, to czas oczekiwania na pierwsze zadziałanie timera, a interval, to czas między kolejnymi wywołaniami timera.

0

Super Panowie, teraz jest już dla mnie wszystko jasne. Faktycznie, wydaje się to nawet logiczne. Wiecie co, bo ten kod mi oczywiście działa tylko mam pewien problem. Odliczanie kończy mi się na 0001. I zegar staje. A powinien zatrzymać się na 0000

0

Moim zdaniem problem jest wyłącznie z wyświetlaniem tylko nie wiem gdzie. Teraz dodałem gong że jak się skończy czas to wywołuje mi odtwarzanie dźwięku informującego o tym. I efekt jest taki że gong nie załącza się od razu jak się zapali 0001 tylko on tak jakby jeszcze czekał tą jedną sekundę czyli aż będzie 0000 i dopiero odpala gong. Czyli tylko wyświetlanie kończy się tak dziwnie na wartości 01 na końcu

1 użytkowników online, w tym zalogowanych: 0, gości: 1