Невозможно передать значение между методами в одном классе в Android - PullRequest
0 голосов
/ 30 июня 2018

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

Код, который я пытаюсь передать:

private void getPrice() {

    DatabaseReference dbRequest = FirebaseDatabase.getInstance().getReference(Common
            .request_tbl).child(riderId).child("details"); // "Requests"
    dbRequest.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child : dataSnapshot.getChildren()) {
                if (child.getKey().equals("price")) {
                    price = Double.valueOf(child.getValue().toString());
                    Log.d(TAG, "getPrice: price = " + price);
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
}

Где я пытаюсь передать значение "цена":

private void recordData(String riderId) {

    getPrice();
    Log.d(TAG, "recordData: price = " + price);

    ...
}

Значение цены в getPrice () соответствует ожидаемому значению, но когда я распечатываю значение в recordData (), значение = null

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Используйте обратный вызов как часть получателя

private void getPrice(ValueEventListener listener) {
    DatabaseReference dbRequest = FirebaseDatabase.getInstance().getReference(Common
            .request_tbl).child(riderId).child("details"); // "Requests"
    dbRequest.addValueEventListener(listener);
}

назовите это

getPrice(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot child : dataSnapshot.getChildren()) {
            if (child.getKey().equals("price")) {
                price = Double.valueOf(child.getValue().toString());
                Log.d(TAG, "getPrice: price = " + price);
                // Call a separate function that actually needs the price here
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
       // Don't ignore your errors!
    }
);
// Note: price will still be null here
0 голосов
/ 30 июня 2018

Ваш getData не получает никаких данных. Он только устанавливает слушателя, который будет выполняться, когда есть событие onDataChanged. (При изменении некоторых данных).

В настоящее время, что он делает - он устанавливает слушателя, который будет ожидать события onDataChanged из recordData, а затем немедленно выводит цену, которая еще не инициализирована или не изменилась.

Если вы хотите выполнить метод recordData, вы должны делать это только после изменения данных.

Другими словами, это должно быть что-то вроде:

private void setUpListenerForPrice() {

   DatabaseReference dbRequest = FirebaseDatabase.getInstance().getReference(Common
        .request_tbl).child(riderId).child("details"); // "Requests"
   dbRequest.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot child : dataSnapshot.getChildren()) {
            if (child.getKey().equals("price")) {
                price = Double.valueOf(child.getValue().toString());

                 // call data recording from the listener, after the price acquires a values.
                 recordData(price);

               // Log.d(TAG, "getPrice: price = " + price);
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
});
}

, а затем

private void recordData(double newPrice) {


Log.d(TAG, "recordData: price = " + newPrice);

// do other data recording operations
...
 }
0 голосов
/ 30 июня 2018

Отвечая на ваш вопрос в комментариях: вам не нужно передавать параметры в скобках, потому что вы настраиваете обратный вызов.

Но ваша проблема проистекает из приоритета методов. Значение еще не там, когда вы звоните recordData.

Сценарий состоит в том, что в recordData вы выполняете строку getPrice(), но выполнение не ожидает завершения getPrice(), потому что это обратный вызов, и значение будет возвращено, как только оно будет получено, что может быть долго после. Чтобы доказать это, вы можете посмотреть свой журнал. Скорее всего, этот журнал:

Log.d(TAG, "recordData: price = " + price);

будет до этого:

Log.d(TAG, "getPrice: price = " + price);

Так что вам лучше всего выполнить recordData, когда вы точно знаете, что значение готово, или вызвать его внутри onDataChange.

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