Использование функции void для обновления массива, но этот массив пуст - PullRequest
0 голосов
/ 30 октября 2019

Итак, я создал функцию void, которая должна помещать некоторые значения в массив. Я вызываю функцию, затем вызываю переменную массива, и она вылетает, говоря, что она нулевая. Я также использую firebase, чтобы получить все значения.

Это функция:

    private void findRestaurantKey()
{
    mDatabase = FirebaseDatabase.getInstance();
    mDatabaseReference = mDatabase.getReference("x");
    mDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                int i = 0;
                for (DataSnapshot d : dataSnapshot.getChildren()) {
                    allRestNames[i] = d.getKey();
                    i++;
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

И вот как я пытаюсь вызвать ее:

   protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.food_activity);
    this.findRestaurantKey();
    Log.d("ARRAY" , allRestNames.toString());
  }

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Вам нужно инициализировать ваш массив.

List<String> allRestNames = new ArrayList();

Но если вы запустите код так, как он у вас есть, вы не Log ничего

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

Когда вы отправляете запрос к API, как вы делаете это с помощью службы Firebase, требуется время.

Итак, что вы должны сделать, если хотите Записать результаты, сделайте это в обратном вызове:

protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.food_activity);
    findRestaurantKey();
}


private void findRestaurantKey() {
    mDatabase = FirebaseDatabase.getInstance();
    mDatabaseReference = mDatabase.getReference("x");
    mDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot d : dataSnapshot.getChildren()) {
                    allRestNames.add(d.getKey());
                }

                // HERE is when the data is available from the Firebase service
                Log.d("ARRAY" , allRestNames.toString());
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}
1 голос
/ 30 октября 2019

Вам нужно где-то инициализировать ваш массив:

allRestNames = new String[5000];

Используйте любое подходящее число вместо 5000. Если вы не знаете, с какого размера создать массив, вы должны использовать ArrayList вместо массива.

Кроме того, findRestaurantKey() создает прослушиватель для вашей базы данных Firebase. Когда этот метод возвращается, данные еще не доступны, потому что слушатель еще не был вызван. Таким образом, даже если вы исправите текущую ошибку, вы не получите никаких значимых данных от вызова allRestNames.toString() в onCreate().

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