Начать данные в Firebase - Android - PullRequest
0 голосов
/ 27 января 2019

Я хочу получить значение из firebase, я хочу изменить значение в firebase и затем сбросить старое значение, но мой код извлечет исходное значение после выполнения кода.

public class MyReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
private int leaf1R;
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(SMS_RECEIVED)) {
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            FirebaseDatabase database = FirebaseDatabase.getInstance();

            DatabaseReference leaf1RRef = database.getReference("leaf1").child("r");
            leaf1RRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    Integer red = dataSnapshot.getValue(Integer.class);
                    leaf1R=red;
                    Log.i("MyLeaf", "Catch: "+leaf1R);

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

            leaf1RRef.setValue(255);
            Log.d("MyLeaf", "Put max value");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            leaf1RRef.setValue(leaf1R);
            Log.d("MyLeaf", "Put old value");
        }
    }

}
}

Мой вывод:

Положить максимальное значение

Положить старое значение

Поймать: 255

Я хочу:

Вылов: 255

Положить максимальное значение

Положить старое значение

1 Ответ

0 голосов
/ 28 января 2019

Данные загружаются из Firebase асинхронно.Вместо того, чтобы ждать, пока база данных станет доступной, ваш основной код продолжается.Затем, когда данные доступны, ваш onDataChange вызывается с моментальным снимком этих данных.

По этой причине весь код, которому нужны данные, должен быть (вызван) внутри onDataChange.Таким образом, очень простое решение для вашей проблемы может быть:

FirebaseDatabase database = FirebaseDatabase.getInstance();

DatabaseReference leaf1RRef = database.getReference("leaf1").child("r");
leaf1RRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Integer red = dataSnapshot.getValue(Integer.class);
        leaf1R=red;
        leaf1RRef.setValue(255);
        Log.d("MyLeaf", "Put max value");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.d("MyLeaf", "Put old value");
        leaf1RRef.setValue(leaf1R);
    }
    @Override
    public void onCancelled(DatabaseError error) {
        Log.w("MyLeaf", "Failed to read value.", error.toException());
    }
});

Обратите внимание, что этот код все еще блокирует основной поток / поток пользовательского интерфейса в onDataChange, к которому Android не относится.Таким образом, хотя это может работать при тестировании, Thread.sleep() может привести к тому, что ОС убьет / оштрафует ваше приложение.См. Этот вопрос для альтернативного способа задержки второго setValue(): Как приостановить / перевести нить или процесс в Android?

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