Zbliżamy się do końca konkursu DSP, to już przedostatni wpis, noo i trzeba pomyśleć o jakiejś stabilizacji. Aplikacja nie będzie ukończona do dwudziestego wpisu, ale w jakiś sposób musi działać. Finalnie pewnie będzie ukończona we wrześniu, nie będę nad nią działał sam 😉 Dzisiaj dodałem kod odpowiedzialny za uruchamianie zadań praktycznych, testów i customowych prób. Kod dla funkcjonalności porównywania i dodawania. Najwięcej czasu zajęły poprawki w wyglądzie i obsługa nowych przycisków, reszta poszła błyskawicznie, dzięki zaimplementowaniu wielu rzeczy w nadklasie. Szybki rzut oka na aplikację:
Więcej funkcji się już niestety nie pojawi, następny wpis będzie o drobnych poprawkach w wyglądzie, etc. Ale skupmy się na tym co dodałem, czyli np funkcji porównywania z opcją ustawienia sobie czasu i ilości odpowiedzi:
Kodzik głównie dziedziczy, te funkcjonalności się powtarzają, więc w sumie czemu nie 😉 Spójrzmy np na to:
@Override
@OnClick(R.id.successView)
public void onClickSuccessView() {
if (operation.nextPoint(true))
nextActivity(true, CompareCheckActivity.this);
else
onClickCommon();
}
@Override
@OnClick(R.id.failureView)
public void onClickFailureView() {
if (operation.nextPoint(false))
nextActivity(false, CompareCheckActivity.this);
else
onClickCommon();
}
@Override
@OnClick(R.id.fab)
public void onClickFab() {
if (!isScreenFiled()) {
stopTime();
fillScreen(counterRight == counterLeft, true);
} else {
if (counterRight == counterLeft)
onClickSuccessView();
else
onClickFailureView();
}
}
@Override
public void onClickCommon() {
stackBricksElementsOperation.hideStack(bricksLeftArray);
stackBricksElementsOperation.hideStack(bricksRightArray);
unFillScreen(counterRight == counterLeft, true);
createReadyView();
}
Jak już pisałem wcześniej, mamy tutaj interfejs operation który decyduje którą implementację wybrać. Metoda nextPoint odpowiada true, jeśli mamy wystartować następną aktywność, lub false jeśli wyczyścić ekran i wykonać inne operacje, które mamy opisane w jednej metodzie: onClickCommon. Ważne aby wyczyścić ekran, zanim wylosujemy następne numery. Animacja się rozpocznie w osobnym wątku, i wszystko zdąży się wykonać, zanim zauważymy zmiany. To bardzo fajna cecha, nie trzeba o tym myśleć i przydatna w większości przypadków. Ale niestety nie we wszystkich, np trzeba pamiętać, aby wyłączać parametr clickable na elementach, kiedy uruchamiamy jakąś długo trwającą animację i nic ma jej nie przerywać.
Jak widać czasem przygotowanie sobie dobrego API, i wydzielenie kodu który się powtarza niejednokrotnie trwa dłużej, niż faktyczne korzystanie z niego. I wydaje mi się, że to dobra droga, w przypadku rozrastania się programu, o wiele łatwiej można dodawać nowe funkcje.
Pozdrawiam!























