почему ArrayList в методе onDataChange метода addValueEventListener firebase не равен null, но превосходит его как null? - PullRequest
0 голосов
/ 02 мая 2018

В своем проекте я прочитал данные из Firebase и добавил свои данные в Arraylist<object>.

Я создаю Arraylist в oncreate () и использую его в onDataChange().

В onDataChange методе addValueEventListener ArrayList не равен нулю, он читается правильно. Но снаружи это читается 0 (ноль). Почему это так?

Мой код:

public class MainActivity extends AppCompatActivity {


    private ArrayList<myObject> myListOfObjact;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


// Write a message to the database
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference();


        myListOfObjacts= new ArrayList<myObject>();

         Log.e(TAG, " myListOfObjacts.size: " + myListOfObjacts.size());
         // size of myListOfObjacts here is 0 (null) 

// Read from the database
        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot postsnapshot : dataSnapshot.getChildren()) {

                    myObject data1 = postsnapshot.getValue(myObject.class);
                    myListOfObjacts.add(data1);
                }

            Log.e(TAG, " myListOfObjacts.size: " + myListOfObjacts.size());
            // size of myListOfObjacts here is reading correctly 

            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.w(TAG, "Failed to read value.", error.toException());
            }
        });    

           Log.e(TAG, " myListOfObjacts.size: " + myListOfObjacts.size());
           // size of myListOfObjacts here also is 0 (null) 

    }

}

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

addValueEventListener () является асинхронным, что означает, что он немедленно возвращается к вызывающей стороне, в то время как Firebase SDK отправляется и делает запрос на сервер, пока ваш код продолжает выполняться. Обратный вызов, который вы передаете ему, происходит через некоторое время, после запрос завершен. Вы не знаете, как долго это будет продолжаться, и вы не должны делать никаких предположений по этому поводу. Прямо сейчас ваш код предполагает, что результаты доступны сразу после добавления прослушивателя, и это неверно.

Если вы хотите получить результаты слушателя, вы должны делать это только изнутри слушателя. Вы не можете ожидать, что результаты будут доступны раньше.

Если вы хотите узнать больше о том, почему API Firebase являются асинхронными, прочтите этот блог .

0 голосов
/ 02 мая 2018

Клиент базы данных Firebase выполняет все сетевые и дисковые операции вне основного потока.

Клиент базы данных Firebase вызывает все обратные вызовы для вашего кода в главном потоке.

Следовательно, onDataChange () почти всегда запускается после других методов, основанных на потоках (UI), таких как onCreate (), onStart () ..., потому что onDataChange () зависит от скорости интернета вашего устройства. На самом деле значение NULL, которое вы видите, было NULL во время его первого входа или вызова, но не NULL, когда вы видите значения, заполненные в макете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...