730
Rozdział 17.
Kod klasy wewnętrznej
private class UpdateDrinkTask extends AsyncTask<Integer, Void, Boolean> {
private ContentValues drinkValues;
protected void onPreExecute() {
CheckBox favorite = (CheckBox) findViewById(R.id.favorite);
drinkValues = new ContentValues();
drinkValues.put(”FAVORITE”, favorite.isChecked());
}
protected Boolean doInBackground(Integer... drinks) {
int drinkId = drinks[0];
SQLiteOpenHelper coffeinaDatabaseHelper =
new CoffeinaDatabaseHelper(DrinkActivity.this);
try {
SQLiteDatabase db = coffeinaDatabaseHelper.getWritableDatabase();
db.update(”DRINK”, drinkValues,
”_id = ?”, new String[] {Integer.toString(drinkId)});
db.close();
return true;
} catch(SQLiteException e) {
return false;
}
}
protected void onPostExecute(Boolean success) {
if (!success) {
Toast toast = Toast.makeText(DrinkActivity.this,
”Baza danych jest niedostępna”, Toast.LENGTH_SHORT);
toast.show();
}
}
}
Kompletny kod klasy UpdateDrinkTask
Poniżej przedstawiliśmy kompletny kod klasy
UpdateDrinkTask
.
Należy ją dodać do klasy
DrinkActivity
jako klasę wewnętrzną,
sugerujemy jednak, byś zrobił to nieco później, kiedy wyjaśnimy,
jak można ją wykonać, i pokażemy pełny kod pliku DrinkActivity.java.
drinkValues zdefiniowaliśmy jako zmienną
prywatną, gdyż jest używana w metodach
onExecute() oraz doInBackground().
Przed wykonaniem kodu operującego
na bazie danych musimy zapisać
wartość pola wyboru oznaczającego
napój jako ulubiony w obiekcie typu
ContentValues, w zmiennej drinkValues.
Kod wykonujący operacje na
bazie danych jest umieszczony
w metodzie doInBackground().
Kiedy kod operujący na bazie danych zostanie już wykonany
w tle, sprawdzamy, czy udało się to zrobić poprawnie.
W razie problemów wyświetlamy stosowny komunikat.
Kod wyświetlający komunikat musimy umieścić
w metodzie onPostExecute() — aktualizacja ekranu
wymaga bowiem wykonania w głównym wątku
obsługi zdarzeń.
Kursory i zadania asynchroniczne
731
jesteś tutaj
Wykonanie zadania AsyncTask...
Zadanie asynchroniczne można wykonać, wywołując metodę
execute()
klasy
AsyncTask
; przekazuje
się przy tym do niej wszelkie parametry wymagane przez metodę
doInBackground()
. Na przykład
w naszej aplikacji do metody
doInBackground()
klasy
AsyncTask
chcemy przekazać identyfikator
napoju klikniętego przez użytkownika, dlatego powinniśmy uruchamiać zadanie
w następujący sposób:
int drinkId = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);
new UpdateDrinkTask().execute(drinkId);
Typ parametru przekazywanego do metody
execute()
powinien odpowiadać typowi parametrów
metody
doInBackground()
. My przekazujemy wartość całkowitą (identyfikator napoju),
co odpowiada typowi parametru oczekiwanego przez naszą metodę
doInBackground()
.
protected Boolean doInBackground(Integer... drinks) {
...
}
Na kilku następnych stronach przedstawimy kompletny kod pliku
DrinkActivity.java.
// Aktualizujemy bazę danych po kliknięciu pola wyboru
public void onFavoriteClicked(View view){
int drinkId = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);
new UpdateDrinkTask().execute(drinkId);
}
To wywołanie wykonuje zadanie AsyncTask
i przekazuje do niego identyfikator napoju.
…w metodzie onFavoritesClicked()
aktywności DrinkActivity
Nasza klasa
UpdateDrinkTask
(utworzony przez nas obiekt
AsyncTask
) musi
zaktualizować kolumnę
FAVORITE
bazy danych kafeterii Coffeina za każdym
razem, kiedy zostanie kliknięte pole wyboru
favorite
. Oznacza to, że musimy
wywołać metodę
onFavoritesClicked()
aktywności
DrinkActivity
. Poniżej
pokazaliśmy, jak będzie wyglądać nowa wersja tej metody:
Nowa wersja metody onFavoritesClicked()
nie zawiera już kodu aktualizującego
kolumnę FAVORITE bazę danych. Zamiast
tego wywołuje ona obiekt AsyncTask, który
aktualizuje bazę w tle.
Get Android Programowanie aplikacji. Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.