не может получать значения из метода 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()); } } 

One Solution collect form web for “не может получать значения из метода ondatachange”

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

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
  • методы getViewTypeCount и getItemViewType для ArrayAdapter
  • Вы не приняли лицензионные соглашения следующих компонентов SDK
  • Не удалось запустить устройство Genymotion
  • Что означает эллипсис в андроиде?
  • Как удалить все обратные вызовы из обработчика?
  • Почему я хочу избегать конструкторов не по умолчанию в fragmentах?
  • Как проверить версию Google Play?
  • Eclipse JUNO не запускается
  • Входящие и исходящие вызовы Android
  • BroadcastReceiver + SMS_RECEIVED
  • Interesting Posts

    Время выполнения функции измерения в R

    Начальная активность из fragmentа вызывает NullPointerException

    Выполнение локального скрипта / команды на удаленном сервере

    Как вызвать параметризованный метод из JSP с использованием JSTL / EL

    Скопируйте файлы в Linux, избегайте копирования, если файлы существуют в месте назначения

    Какова цель свойства classификатора зависимостей зависимостей Mavens?

    Использование JFreeChart Scatter Plots – это способ разделить стили для наборов данных?

    перегрузка нового / удалить

    Как объединить строки в Swift?

    Вычислить неделю месяца в .NET.

    Прокрутка мыши устанавливает громкость звука в Windows

    Как отправить деньги на любую учетную запись PayPal

    Как искать только имя файла подстроки в Windows?

    Как сохранить видео в VLC с использованием фильтров

    Это нормально, если я опускаю фигурные скобки на Java?

    Давайте будем гением компьютера.