Java 为什么我不能调用方法之外的变量?
在这篇文章中,我可以调用void内部的变量。 当我试图在void外部调用它时,数据是空的 链接: 我已经将变量定义为public 编辑:Java 为什么我不能调用方法之外的变量?,java,android,json,firebase,Java,Android,Json,Firebase,在这篇文章中,我可以调用void内部的变量。 当我试图在void外部调用它时,数据是空的 链接: 我已经将变量定义为public 编辑: public class FormSendActivity extends AppCompatActivity { // form edit text EditText email ; EditText perihal; EditText deskripsi; TextView tes; // variabel untuk menyimpan data
public class FormSendActivity extends AppCompatActivity {
// form edit text
EditText email ;
EditText perihal;
EditText deskripsi;
TextView tes;
// variabel untuk menyimpan data dari edit text menjadi string
public String emails;
public String perihals;
public String deskripsis;
//variabel untuk menampung datauser sesuai login
public String getnama;
public String getusername;
FirebaseAuth firebaseAuth;
public String uid ;
Button kirim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_form_send);
email = (EditText) findViewById(R.id.editText);
perihal = (EditText) findViewById(R.id.editText2);
deskripsi = (EditText) findViewById(R.id.editText4);
kirim = (Button) findViewById(R.id.button);
tes = (TextView) findViewById(R.id.textView3);
firebaseAuth = firebaseAuth.getInstance();
uid = firebaseAuth.getCurrentUser().getUid();
dapatdatauser(uid); // here i call the method of bottom, and put in to a variabel
tes.setText(getusername); // here i put the variabel to textview to test
kirim.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
emails = email.getText().toString();
perihals = perihal.getText().toString();
deskripsis = deskripsi.getText().toString();
Sendmail sendmail = new Sendmail(emails,perihals,deskripsis);
FirebaseDatabase.getInstance().getReference("Sendmail")
.child(getusername).child("Outbox").push()
.setValue(sendmail).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
Toast.makeText(FormSendActivity.this,"Data sudah terkirim !!", Toast.LENGTH_SHORT).show();
Intent i = new Intent(FormSendActivity.this, MainActivity.class);
finish();
}else {
Toast.makeText(FormSendActivity.this,"Data gagal di kirim !!", Toast.LENGTH_SHORT).show();
}
}
});
}
});
}
public void dapatdatauser(String iduser){
// Mendapatkan DataUsers Berdasarkan uid sesuai login
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
DatabaseReference query = reference.child("DataUsers").child(iduser);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
// Memasukkan data kedalam variabel username
getusername = dataSnapshot.child("username").getValue(String.class);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
query.addListenerForSingleValueEvent(valueEventListener);
}}
但我只是想知道,为什么我的代码首先不起作用?
多谢各位
但我只是想知道,为什么我的代码在第一个不起作用
无法获取getusername
值,因为它是异步操作。数据尚未从数据库加载完毕,因此无法访问
但我只是想知道,为什么我的代码在第一个不起作用
无法获取
getusername
值,因为它是异步操作。数据尚未从数据库加载完毕,因此无法访问。OnCreate
将在创建此类的对象时调用,因此它是所有操作中的一次。
因此,这一次只有在onCreate
中初始化变量时,才会设置变量
OnDataChange
是监听器,在数据更改之前,您不会调用此方法并设置变量。
要么你需要添加
tes.setText(getusername)代码>内部onDataChange
,或
getusername=dataSnapshot.child(“用户名”).getValue(String.class)代码>
在tes.setText(getusername)之前的onCreate
内部代码>OnCreate
将在创建此类的对象时被调用,因此它是所有操作中的一次。
因此,这一次只有在onCreate
中初始化变量时,才会设置变量
OnDataChange
是监听器,在数据更改之前,您不会调用此方法并设置变量。
要么你需要添加
tes.setText(getusername)代码>内部onDataChange
,或
getusername=dataSnapshot.child(“用户名”).getValue(String.class)代码>
在tes.setText(getusername)之前的onCreate
内部代码>根据firestore
文档
Cloud Firestore
是异步的
,因此基本上在您的代码中,您是在查询在变量中设置结果之前填充数据的,您必须在多线程
中运行它以避免此问题,或者设计代码以在操作完成后填充数据
我建议你看看这篇文章,它比你的身体更苗条
根据firestore
文档
Cloud Firestore
是异步的
,因此基本上在您的代码中,您是在查询在变量中设置结果之前填充数据的,您必须在多线程
中运行它以避免此问题,或者设计代码以在操作完成后填充数据
我建议你看看这篇文章,它比你的身体更苗条
即使我将variabel设置为public?它让我感到空虚。。所以我应该把所有的代码都放进去?是的。这是asynchronous的行为。即使我将variabel设置为public?它让我感到空虚。。所以我应该把所有的代码都放进去?是的。这是异步的行为。
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
// Memasukkan data kedalam variabel username
getusername = dataSnapshot.child("username").getValue(String.class);
}