Skocz do zawartości
swierzy89

Timer

    Rekomendowane odpowiedzi

    Cześć,

    Szukając w internecie kodu timera prawie zawsze trafiałem na ponizszy kod;] jednak po uruchomieniu dostaje takie cos: -21881844:0-20 ;/ i nie odlicza czasu. proszę o wskazówki, co jest nie tak w tym kodzie oraz czy to jest dobre rozwiązanie timera;]?

    jedyne co dodałem do kodu to ta linijka

    private long mStartTime;

    package com.timer;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.SystemClock;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    
    public class TimerActivity extends Activity {
    
    private Handler mHandler = new Handler();
    private TextView tv;
    
       /** Called when the activity is first created. */
       @Override
       public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.main);
    
           tv = (TextView)findViewById(R.id.textView1);
    
           Button btnToast = (Button)findViewById(R.id.button1);
           btnToast.setOnClickListener(mStartListener);
    
    
       }
    
       OnClickListener mStartListener = new OnClickListener() 
       {
          public void onClick(View v)
          {
             if (mStartTime == 0L) 
             {
               mStartTime = System.currentTimeMillis();
               mHandler.removeCallbacks(mUpdateTimeTask);
               mHandler.postDelayed(mUpdateTimeTask, 100);
             }
          }
       };
    
    
    
    private long mStartTime;
    
    
    
       private Runnable mUpdateTimeTask = new Runnable() 
       {
          public void run() 
          {
            final long start = mStartTime;
            long millis = SystemClock.uptimeMillis() - start;
            int seconds = (int) (millis / 1000);
            int minutes = seconds / 60;
            seconds     = seconds % 60;
    
            if (seconds < 10) 
            {
               tv.setText("" + minutes + ":0" + seconds);
            } 
            else 
            {
               tv.setText("" + minutes + ":" + seconds);            
            }
    
            mHandler.postAtTime(this,start + (((minutes * 60) + seconds + 1) * 1000));
          }
       }; 
    
    }
    

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    ngcore
    SystemClock.uptimeMillis()

    Tu jest problem. A tu opis do czego służy.

    Zamień na: System.currentTimeMillis()

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    dzięki za pomoc, już nie wyrzuca tego ciągu cyfr tylko wyświetla 0:00 i dalej nic... czy nie powinien się zwiększać z każdą sekundą?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    ngcore

    Tu jest problem:

    mHandler.postAtTime(this,start + (((minutes * 60) + seconds + 1) * 1000));

    Poczytaj do czego służy postAtTime, dodaj debugowanie żeby zobaczyć jaki czas ustawiasz w metodzie w drugim parametrze i liczę że sam rozwiążesz problem :)

    Ewentualnie możesz użyć postDelayed(Runnable r, long delayMillis)

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    raz jeszcze dzięki za pomoc:) jako drugi parametr w postAtTime dalem SystemClock.uptimeMillis()) i dziala, użyłem mHandler.postDelayed(this,1000); tez wszystko śmiga: D

    Edytowane przez swierzy89

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    ngcore

    Z postDelayed może być zauważalny przeskok czasami o 2 sekundy (czas konieczny na wywołanie metody + oczekiwanie 1 sek), z postAtTime mogłoby takiej sytuacji nie być (aczkolwiek nie testowałem). Kwestia wymagań aplikacji :)

    po uruchomieniu drugi parametr miał wartość 1000, czyli o tym czasie zostaje wywoływana metoda;]?
    \

    Nie 'o tym czasie', tylko 'za tyle czasu' :) w milisekundach

    Z postAtTime spróbuj może tak (ale piszę bez testowania):

    mHandler.postAtTime(this,start + 1000));
    

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    mHandler.postAtTime(this,start + 1000));

    nie działa;p zawiesza aplikacje

    hmm dam sobie już spokój z tym postAtTime ;]

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    mHandler.postAtTime(this,start + 1000));

    nie działa;p zawiesza aplikacje

    hmm dam sobie już spokój z tym postAtTime ;]

    oczywiście ze działa trzeba wiedzieć jeszcze jak tego użyć ;) wypadało by przeczytać instrukcje: INSTRUKCJA

    podrzucę kod którego pewnie nie widziałeś choć był na forum, może czegoś się nauczysz

    public abstract class CycleTask {
    
    public enum Running {YES, NO};
    private Timer mExecutor;
    private TimerTask mTask;
    private volatile Running mRunnung = Running.NO;
    
    public void start(int statTime, int cycleTime) {
    	if (mRunnung == Running.YES) {
    		return;
    	}
    	mRunnung = Running.YES;
    	mExecutor = new Timer("CycleTask", true);
    	mTask = new TimerTask() {
    
    		public void run() {
    			execute();
    		}
    
    	};
    	mExecutor.scheduleAtFixedRate(mTask, statTime, cycleTime);
    }
    
    public void stop() {
    	mTask.cancel();
    	mExecutor.cancel();
    	mExecutor.purge();
    	mRunnung = Running.NO;
    }
    
    public boolean running() {
    	return mRunnung == Running.YES;
    }
    
    protected abstract void execute();
    
    }

    tworzysz klasę rozszerzającą potem, obiekt wykonujesz metodę start(); i w rozszerzającej klasie co zadany okres czasu będzie wykonywana metoda execute(); wraz z całą zawartością

    start(int statTime, int cycleTime); pierwszy argument mówi po ilu ms ma się zacząć odliczanie a drugi co ile ms ma następować zdarzenie

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.