Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我不能调用方法之外的变量?_Java_Android_Json_Firebase - Fatal编程技术网

Java 为什么我不能调用方法之外的变量?

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

在这篇文章中,我可以调用void内部的变量。 当我试图在void外部调用它时,数据是空的

链接:

我已经将变量定义为public

编辑:

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);

    }