Witam.
Mam problem z obiektami, niestety.
Otóż wewnątrz moich activity w aplikacji mam klasę, powiedzmy PobierzPlik, rozszerzającą AsyncTask służącą do pobrania małego pliku tekstowego. W każdym z Activity różni się ona treścią metody onPostExecute i tylko tym. W jednej z aktywności potrzebuję użyć PobierzPlik (oczywiście z różnymi onPostExecute) nawet dwukrotnie. Rozwiązałem to w ten sposób, że dwie klasy nazwałem inaczej (załóżmy PobierzPlik2). Jest przez to sporo kodu, co chciałbym skrócić.
Teraz pytanie zasadnicze: czy mogę stworzyć zewnętrzną klasę PobierzPlik (w zewnętrznym pliku, jak rozumiem)? Mam na myśli problem (dla mnie problem), jak z onPostExecute obiektu klasy PobierzPlik wywołać jakąś metodę ZróbCoś wewnątrz mojej klasy AcitityJakieśTam. Metoda ZróbCoś musiałaby oczywiście "zostać poinformowana", z którego obiektu została wywołana - jak wspomniałem, w jednym activity np. potrzebowałbym dwóch takich obiektów.
Jestem w pracy, więc teraz nie mogę podesłać kodu, jaki stosuję w tej chwili.
Wiem, że trochę nie za ciekawie to opisałem, ale może ktoś biegły w programowaniu obiektowym mi pomoże.
0
2
Proste, zrób sobie klasę abstrakcyjną rozszerzającą ASyncTask np taką
public abstract class Test extends AsyncTask {
@Override
protected Object doInBackground(Object[] params) {
return null;
}
@Override
protected void onPostExecute(Object o) {
getFile();
}
protected abstract void getFile();
}
i stwórz sobie tyle klas ile potrzebujesz dziedziczących po Test i implementujących tylko metodę getFile
np
public class MyTest extends Test {
@Override
protected void getFile() {
// Tutaj zrob cos dla tej konkretnej klasy
}
}
takich klas możesz natłuc już bardzo dużo i robić sobie znimi co chcesz. A tak naprawdę to nawet nie musisz tworzyć własnej abstrakcyjnej metody tylko wystarczy że będzie napisywał postExecute w każdej ze swoich klas :)
pzdr
0
wojciechmaciejewski napisał(a):
Proste
Lubię takie odpowiedzi :)
Dziękuję - będę "męczył" temat wieczorem i dam znać, co mi z tego wyszło :)
EDIT:
Bardzo dziękuję za pomoc. Nadpisuję onPostExecute i działa pięknie :)
Jedna uwaga. W moim przypadku nie deklarowałem klasy i metod jako abstrakcyjnych.