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
Popularne artykuły
Kategorie
Archiwum
Tagi
O autorze
- Programista Android
Opublikowano 27.08.2011, Miejsce pracy: Białystok
- Stoper
- Widget i przechowywanie danych
- Sprawdzenie stanu połączenia
- Sterowanie inną aplikacją
- Problem z emulatorem
- AsyncTask – asynchroniczne wykonywanie czasochłonnych zadań
- Activity – podstawowe informacje, cykl życia
- Content Providers – dostęp do danych przy pomocy dostawców treści
- Wykorzystanie Map Google w naszej aplikacji
- Podstawowe elementy UI – Button, EditText, TextView, Toast, LinearLayout
- Biblioteki zewnętrzne
- Geolokalizacja
- Kompatybilność
- Narzędzia
- Pierwsze kroki
- Podstawowe komponenty
- Przechowywanie danych
- Środowisko pracy
- UI
- Wielowątkowość
- Listopad 2011 (1)
- Sierpień 2011 (21)
- Lipiec 2011 (17)
|
|
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 StanekinterwałstopertimerlinkToporMirosław StaneklinkMirosław StaneklinkMirosław StaneklinkToporlinkToporlinkpawel.izyckilinkMirosław StaneklinkToporlinkToporlinkActivityAlertDialogAndroidManifestAppWidgetAVDBindingBroadcastReceiverButtonDialogEditTextFiltry IntencjiGeolokalizacjaGoogle MapsGPSIDEIntentIntentFiltersksoap2ListViewMapViewMapyNinePatchNotificationPendingIntentPowiadomieniaPraca w tlePreferenceActivityProgressDialogprzechowywanie danychRotacjaSDKServicesSharedPreferencesSMSSOAPSQLiteTextViewTitlebarToastUIUstawieniaUsługiViewHolderWebViewWidget
0zadane 16 sierpnia 20110accepted10000000