如何在外部方法中获取值asynchronousonDataChange()

对不起,如果我的英文不好。 但是我希望你能理解我编码中的错误。

我想从函数“ambilKey()”中检索值,以便在外部方法onDataChange()中获取“hasilKey”的值。 请让我的代码,我需要在外部方法onDataChange()getvalue“hasiKey”。

[MyPictureDatabaseFirebase] [1]

[MyPictureResultLog] [2]

public class IbuActivity extends AppCompatActivity { private FirebaseAuth mAuth; private String hasilKey="error"; private DatabaseReference dbAmbilKeyPengguna; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ibu); mAuth=FirebaseAuth.getInstance(); //Retrieve Value hasilKey is my problem ambilKey(); //Check Value Log.i("Result=",hasilKey); //hasilKey Not Working and not saved } private void ambilKey() { dbAmbilKeyPengguna=FirebaseDatabase.getInstance().getReference().child("DataPengguna").child(mAuth.getCurrentUser().getUid()).child("BisnisId"); dbAmbilKeyPengguna.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { hasilKey=dataSnapshot.getValue(String.class); Log.i("ResultKeyAmbilKey=",hasilKey); // Hasil Key Value Working in this method but after variable used in outside not working } @Override public void onCancelled(DatabaseError databaseError) { Log.i("Pesan","DatabaseError"); } }); } 

}

要解决您的问题,请使用下面的代码。 第一步是定义一个这样的接口:

 public interface OnGetDataListener { public void onStart(); public void onSuccess(DataSnapshot data); public void onFailed(DatabaseError databaseError); } 

第二步是创build一个方法来获取这样的数据:

 public void mReadDataOnce(String child, OnGetDataListener listener) { listener.onStart(); FirebaseDatabase dbAmbilKeyPengguna = FirebaseDatabase.getInstance().getReference().child("DataPengguna").child(mAuth.getCurrentUser().getUid()).child("BisnisId"); dbAmbilKeyPengguna.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { listener.onSuccess(dataSnapshot); } @Override public void onCancelled(DatabaseError databaseError) { listener.onFailed(databaseError); } }); 

最后一步是获取这样的数据:

 private void mCheckInforInServer(String child) { new Database().mReadDataOnce(child, new OnGetDataListener() { @Override public void onStart() { //DO SOME THING WHEN START GET DATA HERE } @Override public void onSuccess(DataSnapshot data) { //DO SOME THING WHEN GET DATA SUCCESS HERE } @Override public void onFailed(DatabaseError databaseError) { //DO SOME THING WHEN GET DATA FAILED HERE } }); } 

这样,你也可以重用这个方法并处理数据。