TreeMap автоматически удаляет себя - PullRequest
0 голосов
/ 17 мая 2019

Мой код извлекает логические значения из базы данных Firebase в реальном времени. Однако эти значения автоматически удаляются без видимой причины. Я не понимаю, почему это происходит, и я схожу с ума.

Код должен работать следующим образом: создать представление, загрузить логические значения, если они существуют, готово.

Это то, что, кажется, происходит: создать представление, загрузить булевы значения, если они существуют, стереть их, готово.

Вот мой код:

public class ACdayFragment extends Fragment {

//TAG
private static final String TAG = "ACdayFragment";

//Context
private Context context;

//Days for Booleans
Boolean Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;

//Firebase Stuff
FirebaseMethods firebaseMethods;
DatabaseReference userDatabase;
DatabaseReference availDatabase;
FirebaseAuth mAuth;

//Strings
String key = mAuth.getInstance().getUid();

//TreeMap
TreeMap<Integer, Boolean> dayMap = new TreeMap<>();


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_ac, container, false);

    mAuth = FirebaseAuth.getInstance();
    key = FirebaseAuth.getInstance().getUid();
    userDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(key);
    availDatabase = userDatabase.child("Days");


    //This method should populate my dayMap treemap
    getData();

    //But when I retrieve it here, it appears empty
    Log.e(TAG, "getData0: "+ dayMap);



    return view;
}

private void getData() {
    FirebaseUser user = mAuth.getCurrentUser();

    if (user != null) {
        availDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (getActivity() == null) {
                    return;
                }
                if (dataSnapshot.exists() && dataSnapshot.getChildrenCount()>0) {
                    Map<String, Boolean> map = (Map<String, Boolean>) dataSnapshot.getValue();

                    if (map.get("sunday")!= null) {
                        dayMap.put(0, true);
                    }
                    if (map.get("monday")!= null) {
                        dayMap.put(1, true);
                    }
                    if (map.get("tuesday")!= null) {
                        dayMap.put(2, true);
                    }if (map.get("wednesday")!= null) {
                        dayMap.put(3, true);
                    }if (map.get("thursday")!= null) {
                        dayMap.put(4, true);
                    }if (map.get("friday")!= null) {
                        dayMap.put(5, true);
                    }if (map.get("saturday")!= null) {
                        dayMap.put(6, true);
                    }


                    //This log does show me a populated dayMap
                    Log.e(TAG, "getData1: "+ dayMap );
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
    }
    Log.d(TAG, "getData2: " + dayMap );
}
@Override
public void onStart() {
    super.onStart();
}
@Override
public void onStop() {
    super.onStop();
}
}

1 Ответ

1 голос
/ 17 мая 2019

В основном вам необходимо понять, что происходит между следующими 2 строками кода:

getData(); //Fire and Forget
//...
//The getData() method has requested data from Firebase but it takes sometime to return the data
//Meanwhile, this method execution doesn't wait for Firebase and hence the dayMap in the next line is not filled yet!
//...
Log.e(TAG, "getData0: "+ dayMap); //Does not wait for Firebase to return the data

Метод getData () просто создает и добавляет объект ValueEventListener, который содержит метод onDataChange,этот метод вызывается впервые, когда Firebase завершает выборку данных.Обратите внимание, что он также будет вызываться при каждом обновлении данных.Пожалуйста, обратитесь к документации ValueEventListener

Я предлагаю вам сначала понять Синхронное и асинхронное выполнение .Кроме того, вы должны узнать о слушателях и обратных вызовов .

PS: @NewAppDeveloping Не ненавидите себя.Просто изучите основы.

ОБНОВЛЕНИЕ:

Самый простой способ исправить это - сделать что-то с картой логического дерева, обновив метод onDataChangeкак показано ниже:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    if (getActivity() == null) {
        return;
    }
    ....
    ....//Your existing code: Get the booleans and create the treemap
    ....
    //This log does show me a populated dayMap
    Log.e(TAG, "getData1: "+ dayMap );

    ....//Do what you intend to here like filling the view/ updating the view, etc.
}

onCreateView должен возвращать представление, и если вы ждете данных от Firebase, это не правильно.Вы должны вернуть пустое представление и заполнить его после получения данных, как указано выше.

...