android - 在 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()
方法行通过后变为空。有什么解决办法吗?
解决方案
这段代码有几个概念上的问题。首先, onCreate()
is called before onStart()
that is, onCreate()
is called first and then only onStart()
。其次,fSaldo = (String) singleSnapshot.child("saldoUser").getValue();
在 onDataChanged 内部,因此我们不知道何时调用该方法以及何时设置该值,它是异步的。但这并不重要,因为您需要先修复第一个错误。
推荐阅读
- angular - 如何在单独的文件中声明常量
- keras - 使用 softmax 的 Keras TimeDistributed Dense 未按时间步进行归一化
- pyqt - pyqt - 单击 QTableWidget 标题以获得唯一列
- javascript - Javascript 减少到 PHP array_reduce
- r - 每组最后一行所需的rollsum结果
- matlab - 从 Matlab 2018 中的复选框获取值
- php - Ionic 应用 PHPSESSID 在 iOS 上的每个 HTTP 请求上都会发生变化,但在 android 上运行良好
- jenkins - 詹金斯自动部署
- visual-studio-code - VS Code:突出显示带有 SVN 扩展名的修改文件
- typescript - 尝试更新标记的联合时出现令人惊讶的类型错误