Stoper | android4devs

Witam.

Potrzebuje do mojej aplikacji zrobić stoper. Ktoś klika start (działa tutaj nie tylko stoper ale inne akcje) i na ekranie jest czas od naciśnięcia start, tzn ktos widzi ile czasu upłyneło od naciśnięcia start.

Kombinowałem, zeby to jakoś może pętlę w nieskończonośc zrobic i co chwile pobierać aktualną godzine i odejmować od niej godzine w chwili start, ale to raczej zamuli całą aplikację.

Jak by to rozwiązać?

Oto kod, który uruchamia stoper:

Pamiętaj, że nie zaimplementowano w nim resetowania ani uruchamiania stopera od początku (to już zadanie dla Ciebie ). Tutaj po ponownym kliknięciu „Start” licznik będzie szedł po prostu 2 razy szybciej.

Ok, więc zakładam, że cały poniższy kod zawiera się wewnątrz klasy Aktywności.

Metodę startTimer() wywołujesz w momencie startu stopera. Zakładam też, że gdzieś w aktywności istnieje pole textView, które wykorzystywane jest w metodzie updateTimeTextView.

Wydaje mi się, że najlepszym rozwiązaniem byłoby wykorzystanie klas Timer i TimerTask.

Metoda scheduleAtFixedRate odpala TimerTask (jego metodę run()) w ustalonych odstępach czasowych (w przykładzie co 100milisekund) Wszystko oczywiście działa w osobnym wątku, więc nie blokujesz głównego wątku aplikacji.

Co ważne w powyższym przykładzie – jeżeli metoda updateUI() ma aktualizować jakiś element interfejsu użytkownika, powinniśmy wykorzystać w niej metodę runOnUiThread(…) – http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29.

Chyba mam za małą wiedzę żeby to ogarnąć

Mógłbym prosić o jakiś przykład żeby się zmieniała wartość textView? z resztą już sobie poradze.

Wykombinowałem cos takiego, ale przy kliknięciu w przycisk wywala mi błąd i zamyka aplikacje…

(jak daje w kod, to nie układa sie jak powinien ;/ )

————————

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
>

<Button android:text=”Button”
android:id=”@+id/przycisk”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”>
</Button>

<TextView android:text=”TextView”
android:id=”@+id/textView”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”>
</TextView>
</LinearLayout>

Ten artykuł może być dla ciebie pomocny:
http://developer.android.com/resources/articles/timed-ui-updates.html

Problem polega na tym, że nie masz nigdzie w kodzie Aktywności obiektu TextView. Dodaj sobie pole private TextView textView. I w metodzie onCreate() zainicjalizuj je tak samo jak przycisk, odnosząc się do ID podanego w pliku XML.

Poddaje się. Nie mam już do tego nerwów.

Mógłby ktoś napisać całość i zamieścić tutaj? 

Tak, żebym mógł skopiować i żeby działało, i wtedy analizować jak to jest zrobione i dlaczego działa tak a nie inaczej?

Dziękuje bardzo, teraz już wszytko jasne. Zabieram sie do programowania dalej

Jeśli chcesz załączyć kod źródłowy przejdź do edytora HTML (ostatni przycisk – Show source) i swój kod umieść wewnątrz znaczników <pre class=”brush: język”></pre> (np. <pre class=”brush: java”>System.out.println(„Lorem ipsum”)</pre> ).
Listę dostępnych języków znajdziesz na tej stronie.

Tylko zarejestrowani użytkownicy mogą odpowiadać na pytania.

zaloguj się lub skorzystaj ze swojego profilu:

Student Informatyki Stosowanej na Uniwersytecie Jagiellońskim. Z zamiłowania Android developer, z doświadczenia programista webowy i producent muzyczny (Dreamlab Onet.pl, RMF FM, eLO RMF) . Uzależniony od podróży, dobrej kawy, i gier wideo. Pracoholik (tak mówią) i gadżetomaniak (tak sądzi).

Zaloguj się lub skorzystaj ze swojego profilu

Odpowiedzi: 9

Odpowiedzi: 5

Odpowiedzi: 4

Odpowiedzi: 3

Odpowiedzi: 2

Komentarzy: 9

Komentarzy: 4

Komentarzy: 4

Komentarzy: 3

Komentarzy: 2

© 2012 android4devs.pl

created by froger_mcs

Stoper

9 Odpowiedzi

Twoja odpowiedź

O autorze

Ostatnie oferty pracy

Najpopularniejsze pytania

Kategorie

Archiwum

Tagi

O autorze



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

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class HelloWorldActivity extends Activity {
	private TextView tvCounter;
	private Button btnStart;

	private int counter = 0;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		tvCounter = (TextView) findViewById(R.id.tvCounter);
		btnStart = (Button) findViewById(R.id.btnStart);
		btnStart.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				startCounting();
			}
		});
	}

	private void startCounting() {
		Timer timer = new Timer();
		TimerTask task = new TimerTask() {
			@Override
			public void run() {
				updateCounter();
			}
		};
		timer.scheduleAtFixedRate(task, 0, 1000);
	}

	private void updateCounter() {
		runOnUiThread(new Runnable() {
			public void run() {
				tvCounter.setText("Time: " + counter + "s");
				counter++;
			}
		});
	}
}
    private void startTimer() {
    	Timer timer = new Timer();
    	int period = 1000;
    	TimerTask task = new TimerTask() {
			@Override
			public void run() {
				updateTimeTextView();
			}
		};
		timer.scheduleAtFixedRate(task, 0, period);
    }

    private void updateTimeTextView() {
    	runOnUiThread(new Runnable() {
    		TextView textView;
			public void run() {				time++;				textView.setText("Czas: " + time + "s");
			}
		});
    }
	private void startTimer() {
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				updateUI();
			}
		}, 0, 100);
	}
package my.stoper;
import java.util.Timer;
import java.util.TimerTask;
import my.stoper.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class StoperActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button B_start = (Button)findViewById(R.id.przycisk);

        B_start.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                // TODO Auto-generated method stub
                startTimer();
            }
        });

    }

    private void startTimer() {
        Timer timer = new Timer();
        int period = 1000;
        TimerTask task = new TimerTask() {
            long time = 0;
            @Override
            public void run() {
                updateTimeTextView(time++);
            }
        };
        timer.scheduleAtFixedRate(task, 0, period);
    }

    private void updateTimeTextView(final long time) {
        runOnUiThread(new Runnable() {
            TextView textView;
            public void run() {
                textView.setText("Czas: " + time + "s");
            }
        });
    }

}

Mirosław StanekMirosław StaneklinkToporMirosław StaneklinkMirosław StaneklinkMirosław StaneklinkToporlinkToporlinkpawel.izyckilinkMirosław StaneklinkToporlinkToporlinkActivityAlertDialogAndroidManifestAppWidgetAVDBindingBroadcastReceiverButtonDialogEditTextFiltry IntencjiGeolokalizacjaGoogle MapsGPSIDEIntentIntentFiltersksoap2ListViewMapViewMapyNinePatchNotificationPendingIntentPowiadomieniaPraca w tlePreferenceActivityProgressDialogprzechowywanie danychRotacjaSDKServicesSharedPreferencesSMSSOAPSQLiteTextViewTitlebarToastUIUstawieniaUsługiViewHolderWebViewWidget

0 zadane 16 sierpnia 20110accepted10000000

Przewijanie do góry