web-dev-qa-db-ja.com

Android

自分で非同期のFireBase getValueメソッドの結果を保存する必要があります。 「onPostExecute()」のようなものは使用できません。また、他のアクティビティで将来参照する必要があるため、「onDataChange()への」すべての操作を実行できません。

ここにデータを取得するための私のスニペット:

    List<Village> villages = new LinkedList<>();
    Firebase ref = new Firebase("MYFIREBASEURL").child("village");
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            spinnerArray.clear();
            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                Village v = postSnapshot.getValue(Village.class);
                villages.add(v);
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            System.out.println("The read failed: " + firebaseError.getMessage());
        }
    });

「onDataChange」から村を読み取ろうとすると、当然のことながら、非同期のライフではnull値になります。 onDataChangeが呼び出されたことを確認する方法はありますか?.

11
Marco Rossini

私の英語があまりにも悪いのでそれがあなたが望むものではないなら申し訳ありません。それを処理するリスナーインターフェイスを定義できます。例:

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

そして、Database.classでデータを取得するカスタム関数を作成します。

  public void mReadDataOnce(String child, final OnGetDataListener listener) {
    listener.onStart();
   FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            listener.onSuccess(dataSnapshot);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            listener.onFailed(databaseError);
        }
    });
}

Main.classからデータを取得したいときは、次のようにします。

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

}

これにより、メソッドを再利用してデータを処理できます。

21

マンの答えに追加するには、直前にonStart()を呼び出します

_ FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() {
_

そしてonStart()では、通常、progressDialogを表示します:

_    if (mProgressDialog == null) {
        mProgressDialog = new ProgressDialog(getContext());
        mProgressDialog.setMessage(getString(R.string.loading));
        mProgressDialog.setIndeterminate(true);
    }

    mProgressDialog.show();
_

そしてonSuccess()でダイアログを閉じ、データをGUI(またはあなたがやりたいこと)にロードします

_    if (mProgressDialog != null && mProgressDialog.isShowing()) {
        mProgressDialog.dismiss();
    }
_
2
Bakavani India

私が理解したのは、スナップショットデータを変数に保存しようとしているのですが、非同期タスクのために変数がnullであることが判明しました。これは、非同期タスクの性質によるものであり、Firebaseリスナーからスナップショットデータを渡すことができます外部でカスタム関数に関数を割り当て、スナップショットデータをグローバル変数に格納します。その後、変数を好きなように使用できます。

0
Natto