首页 > 解决方案 > 在 onStart 中设置后变量值变为 null

问题描述

我试图用onStart()方法设置一些变量,但是当涉及到onCreate()方法时,它们的值变为空。

这是onStart()方法:

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

    Query emailQuery = mDatabase.orderByChild("emailUser").equalTo(emailUser);
    emailQuery.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
                fSaldo = (String) singleSnapshot.child("saldoUser").getValue();
                fHeaderName = (String) singleSnapshot.child("username").getValue();
                fHeaderMail = (String) singleSnapshot.child("emailUser").getValue();
                phone = (String) singleSnapshot.child("phone").getValue();

                Log.d("Cozmo", "Saldo: " + fSaldo); //output: not_null
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

这是onCreate()方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FirebaseAuth fAuth = FirebaseAuth.getInstance();
    FirebaseUser user = fAuth.getCurrentUser();
    emailUser = user.getEmail();

    mDatabase = FirebaseDatabase.getInstance().getReference("Users");

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    Log.d("Cozmo", "Saldo: " + fSaldo); //output is null
}

这是我完整的 MainActivity.class:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

    private String fSaldo, fHeaderName, fHeaderMail, phone;
    private String emailUser;
    private DatabaseReference mDatabase;

    @Override
    protected void onCreate(Bundle savedInstanceState) {...}

    @Override
    protected void onStart() {...}
}

我不明白这些变量再次变为空,并且在onDataChange()方法行通过后变为空。有什么解决办法吗?

标签: androidfirebase-realtime-database

解决方案


这段代码有几个概念上的问题。首先, onCreate()is called before onStart()that is, onCreate()is called first and then only onStart()。其次,fSaldo = (String) singleSnapshot.child("saldoUser").getValue();在 onDataChanged 内部,因此我们不知道何时调用该方法以及何时设置该值,它是异步的。但这并不重要,因为您需要先修复第一个错误。


推荐阅读