Андроид: количество военнослужащих инкремент


Я застрял на создании icrement значения в Java с Firebase, и дело в том, что он не обновляет глобальную переменную. Когда я вызываю EventListener в onStart, он успешно отображает мне правильное значение переменной (60). И когда я хочу увеличить его на 10-с помощью нажатия кнопки-он показывает мне 0.

long value;

@Override
protected void onStart() {
    super.onStart();

    final TextView mValue = (TextView) findViewById(R.id.some_textview);

    mRef = new Firebase(some_correct_url);
    mRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            value = (long) dataSnapshot.getValue();
            mValue.setText(value+"");
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
}

И при нажатии на кнопку вызывается следующая функция

public void addTen(View view) {
    mRef = new Firebase(my_private_url);
    mRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            value =(long) dataSnapshot.getValue();
            value = value + 10;
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {
        }
    });

    mRef.setValue(value);

}

Таким образом, в целом первая часть извлекает правильное значение переменной, но вторая часть не увеличивает правильное значение. Заранее спасибо!

Edit: кстати, я установил правила Firebase следующим образом:

{
"rules": {
".read": "true",
".write": "true"
}
}

Это для времени разработки.

2 3

2 ответа:

Слушатели базы огня стреляют асинхронно. Ваш вызов mRef.setValue(value) выполняется до того, как прослушиватель запустил и обновил value. Измените свой код следующим образом:

public void addTen(View view) {
    mRef = new Firebase(my_private_url);
    mRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            value =(long) dataSnapshot.getValue();
            value = value + 10;
            dataSnapshot.getRef().setValue(value);
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {
        }
    });
}
Обратите внимание, что addListenerForSingleValueEvent() заменено addValueEventListener(). Я не думаю, что вы хотите накапливать слушателей каждый раз, когда звонят addten().

В firestore вы можете увеличить значение, используя этот метод ниже (вы можете уменьшить Метод)

void updateIMEICount(){
    progressDialog.setMessage(getString(R.string.verifying_imei_dialog_message));
    progressDialog.show();

    firebaseFirestore.collection(Constants.FB_IMEI_ROOT_PATH).document("IMEI").get()
            .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if (task.isSuccessful()) {
                        DocumentSnapshot documentSnapshot = task.getResult();
                        final IMEIModel imeiModel = documentSnapshot.toObject(IMEIModel.class);
                        Log.d(TAG, "documentSnapshot imeiModel : " + imeiModel.toString());
                        final IMEIModel imeiModelUpdate = new IMEIModel();
                        imeiModelUpdate.setIMEI(imeiModel.getIMEI()+1);
                        documentSnapshot.getReference().set(imeiModelUpdate).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                progressDialog.dismiss();
                                Log.d(TAG,"imeiModelUpdate updated from : "+imeiModel.getIMEI());
                                Log.d(TAG,"imeiModelUpdate updated to : "+imeiModelUpdate.getIMEI());
                                launchHomeScreen();
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                progressDialog.dismiss();
                            }
                        });

                        progressDialog.dismiss();

                    } else {
                        utility.failureToast("getting call id failed .please try again");
                        progressDialog.dismiss();
                        Log.d(TAG, "getting getCallID failed");
                    }
                }
            });
}