Pobranie wartości stringa z innej klasy, po zmianie jego wartości.

0

Cześć!

Dzisiaj przychodzę do Was z takim jednym gorącym pytaniem - aktualnie tworzę aplikację pod Androida współpracującą z firestore i zaimplementowałem klasę sprawdzającą typ konta. Wszystko działa poprawnie, jednakże chciałbym teraz pobrać wartość "typeOfAcc" z tej klasy w innej klasie, ponieważ będzie to ścieżka do mojego dokumentu w bazie, jednakże jest jeden warunek - ścieżka musi się pobierać dopiero wtedy, kiedy zostaną pobrane dane z bazy i na ich podstawie zostanie ustalone, czy należy zmienić typ konta na "Trenerzy". Ma ktoś jakiś pomysł? Wszystkie moje dotychczasowe próby kończyły się na tym, że po prostu druga klasa pobiera tego stringa, przed zmianą jego wartości, czego wynikiem jest brak dostępu do danych. Sprawdzając po logach, wszystko jest okej, wartość się zmienia, ale niestety po pobraniu wartości. Z góry dzięki za pomoc!

public class UserValid
{
    String typeOfAcc = "Podopieczni";
    FirebaseFirestore fStore;
    FirebaseAuth fAuth;
    DocumentReference documentReference;
    List itemList = new ArrayList<>();
    String userID;

    public UserValid()
    {
        Log.d("TAG", "Błąd, wybrano konstruktor bez argumentów");
    }

    //Metoda sprawdzająca jaki typ konta jest aktualnie obsługiwany
    // Jeśli wartość true - konto podopiecznego, wartość false - konto trenera;
    public UserValid(FirebaseAuth fAuth, FirebaseFirestore fStore)
    {
        userID = fAuth.getCurrentUser().getUid();
        this.fAuth = fAuth;
        this.fStore = fStore;
        documentReference = fStore.collection("Podopieczni").document(userID);

        readData(new FirestoreCallback()
        {
            @Override
            public void onCallback(List<String> list)
            {
                if(itemList.get(0) == null)
                {
                    typeOfAcc="Trenerzy";
                    Log.d("TAG", itemList.toString());

                }
            }
        });


    }
    private void readData(FirestoreCallback firestoreCallback)
    {
        //DocumentReference docRef = db.collection("cities").document("SF");
        documentReference.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful())
                {

                    //for(DocumentSnapshot document : task.getResult()) {
                        String itemName = task.getResult().getString("Imie");
                        itemList.add(itemName);

                   // }
                    firestoreCallback.onCallback(itemList);
                }
            }

        });
    }



    private interface FirestoreCallback
    {
        void onCallback(List<String> list);
    }
}
0

@kunegundek:
Mi pachnie, jakbyś szukał Preferences

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

...

public Date getProposedDate() {
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(myContext);
        int dzien = sharedPref.getInt(ZmianaActivity.DZIEN, 1);
        int miesiac = sharedPref.getInt(ZmianaActivity.MIESIAC, 1);
        int rok = sharedPref.getInt(ZmianaActivity.ROK, 2015);

        return new Date(rok - 1900, miesiac-1, dzien);
    }

generalnie w Andoidzie, w odróżnieniu od "dużej Javy"
nie ma gwarancji, że inna klasa ciągle jeszcze rezyduje w pamięci, może być wyładowana - pamiatka z bardzo biednych pierwszych smartfonów

0
AnyKtokolwiek napisał(a):

nie ma gwarancji, że inna klasa ciągle jeszcze rezyduje w pamięci, może być wyładowana - pamiatka z bardzo biednych pierwszych smartfonów

Jakie wyładowywane klasy z pamięci? Raz załadowana klasa jest dostępna cały czas. Może miałeś na myśli obiekty, ale one zachowują się tak samo pod względem odśmiecania, jak na JVM. Jeśli jest do czegoś referencja z roota, to nie zostanie posprzątane przez GC.

To co jest inne, to możliwość zabicia procesu gdy aplikacja jest w tle. I nie jest to pamiątka z bardzo biednych telefonów, tylko normalne zachowanie spotykane też na dzisiejszych telefonach nawet z 3GB pamięci.

@kunegundek
Ten kod, to jakiś totalny WTF. W konstruktorze obiektu przekazujesz asynchroniczne źródło danych i odpalasz zapytanie, żeby zmutować pole. Musisz zrozumieć, że jak coś jest asynchroniczne, tak jak w tym wypadku documentReference.get().addOnCompleteListener(), to nie możesz dobierać się tak do wartości. Musisz ją zwrócić w inny sposób i korzystać z innych mechanizmów do komunikacji w aplikacji. Na przykład callbacki, Handler + pętla zdarzeń albo jakieś strumienie pozwalające wypychać dane w stylu LiveData, CompletableFuture czy RxJava. Najwygodniejsze jest ostatnie rozwiązanie, ale wymagałoby od Ciebie dużo nauki, więc pewnie powinieneś się skupić na zamodelowaniu komunikacji poprzez callbacki.

0

@Michał Sikora: Hmm okej rozumiem. :D Właśnie starałem się posłużyć callback'ami do sprawdzenia, czy istnieje dokument w danej kolekcji i sam kod co tutaj podesłałem działa, ale właśnie przez swą asynchroniczność nie jestem w stanie w drugiej klasie przechwycić wartości tego stringa po zmodyfikowaniu go, aby móc tam już operować dzięki niemu. W takim wypadku polecasz stworzyć callbacki tak? W sumie masz do polecenia jakieś legit źródło, do nauczenia się stworzenia własnych callbacków w javie? I nie chodzi tutaj, że nie potrafię używać wyszukiwarki YT, Google, etc., sęk w tym, że szukając jak na razie nie znalazłem nic sensownego. :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1