Андроид: количество военнослужащих инкремент
Я застрял на создании 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 ответа:
Слушатели базы огня стреляют асинхронно. Ваш вызов
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"); } } }); }