не может получать значения из метода ondatachange

В настоящее время я разрабатываю приложение для Android, в котором я использую базу данных firebase в качестве базы данных, но когда получена переменная в методе onDataChange и я назначаю ее глобальным переменным, я получил нулевые переменные, но когда я вызываю эти переменные в методе onDataChange, они не ноль.

public class PositionateMarkerTask extends AsyncTask { public ArrayList arrayList= new ArrayList(); public void connect() { //setting connexion parameter final Firebase ref = new Firebase("https://test.firebaseio.com/test"); Query query = ref.orderByChild("longitude"); //get the data from the DB query.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { //checking if the user exist if(dataSnapshot.exists()){ for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { //get each user which has the target username Location location =userSnapshot.getValue(Location.class); arrayList.add(location); //if the password is true , the data will be storaged in the sharedPreferences file and a Home activity will be launched } } else{ System.out.println("not found"); } } @Override public void onCancelled(FirebaseError firebaseError) { System.out.println("problem "); } }); } @Override protected Object doInBackground(Object[] params) { connect(); return null; } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); System.out.println("the firs long is"+arrayList.get(0).getLongitude()); } } 

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

Firebase автоматически восстанавливает / синхронизирует с базой данных в фоновом режиме. Работа выполняется в отдельном streamе, поэтому вам не нужно и AsyncTask . Но, к сожалению, это также означает, что вы не можете дождаться данных.

Обычно я рекомендую вам переделать код из «сначала сделать A, а затем в B» на «всякий раз, когда мы получаем A, мы делаем B с ним».

В вашем случае вы хотите получить данные, а затем распечатать долготу первого элемента. Переделки: при получении данных печатайте долготу первого элемента.

 Query query = ref.orderByChild("longitude"); query.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(dataSnapshot.exists()){ for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { Location location =userSnapshot.getValue(Location.class); arrayList.add(location); } System.out.println("the first long is"+arrayList.get(0).getLongitude()); } else{ System.out.println("not found"); } } @Override public void onCancelled(FirebaseError firebaseError) { System.out.println("problem "); } }); 

Несколько вещей, чтобы отметить здесь:

  1. если вас интересует только первый элемент, вы можете ограничить запрос одним элементом: query = ref.orderByChild("longitude").limitToFirst(1) . Это позволит получить меньше данных.

  2. Я рекомендую использовать addValueEventListener() вместо addListenerForSingleValueEvent() . Первые будут синхронизировать данные. Это означает, что если вы введете / измените долготу элемента в списке, ваш код автоматически будет перезагружен и напечатает (потенциально) новый первый элемент.

  • В чем разница между отклонением или отменой диалога в Android?
  • добавление текстового интерфейса для перетаскивания - Android / Java
  • Android Studio с сервисами Google Play
  • Android Studio 3.1 EditText StackOverflowError
  • Автономный режим для Android-приложения с использованием карт google api
  • Добавление элемента подменю ListView в Android
  • Дальнейшее понимание setRetainInstance (true)
  • Как изменить цвет кнопки в Android при нажатии?
  • Начальная активность из fragmentа вызывает NullPointerException
  • Как получить доступ к дочерним представлениям fragmentа внутри родительской активности fragmentа?
  • Как создать ColorStateList программно?
  • Давайте будем гением компьютера.