Firebase's ValueEventListener работает асинхронно .Вот почему ваш код регистрации в конце печатается раньше, чем ваш асинхронный слушатель срабатывает.Данные из firebase действительно добавляются (отражаются) в глобальную переменную, но после журнала.
Если вы хотите выполнить некоторую логику при изменении данных в firebase, вы должны выполнять свою логику непосредственно внутри ValueEventListener или использовать LiveData или RxJava .
Вот как использовать LiveData:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private String RxuserId;
public ArrayList<String> mToken;
MutableLiveData<String> data = new MutableLiveData<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RxuserId = intent.getStringExtra("Id");
mToken = new ArrayList<>();
if(RxuserId != null){
database.getReference().child("users").child(RxuserId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
data.setValue(dataSnapshot.child("fcm token").getValue().toString());
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
data.observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
mToken.add(s);
Toast.makeText(getApplicationContext(), "REQUIRED TOKRN " + s,Toast.LENGTH_LONG).show();
Log.d(TAG,"REQUIRED TOKRN " + string);
Log.d(TAG,"REQUIRED TOKRN " + mToken.size())
}
});
}
}
Это не очень полезный случай для LivaData.Обычно LiveData используется, когда логика с firebse находится в другом классе (в репозитории MVVM) для изменения пользовательского интерфейса в соответствии с изменением данных.
Список пользователей может храниться так:
// User is model class
List<User> users = new ArrayList<>();
final MutableLiveData<List<User>> data = new MutableLiveData<>();
database.child("users").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<User> users = new ArrayList<>();
for (DataSnapshot ds : dataSnapshot.getChildren()) {
User user = ds.getValue(User.class);
users.add(user);
}
data.setValue(users); // data can be observed later
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});