2017-02-11 4 views
3

私はAndroidベースのアプリケーションで、FirebaseとAndroid Studioを使って作業しています。 onDataChangeメソッド内で値を設定することができなかったため、バリューイベントリスナーで値を取得する際に問題が発生しました。非同期で実行されるため、リスナーが目的を完了していない可能性があります。だから、私はこの問題をonDataChangeメソッド(実際の人生保護人!)の中で何かをすることで解決しました。2つのバリューイベントリスナーをネストすると、それらは両方とも非同期で実行されるのでしょうか、または低い方のイベントリスナーが完了するのを待っていますか?

しかし

私はonDataChangeに取得していた値はまた、別のリスナー内で必要になることを起こります。このように

DatabaseReference mLastnameReference = rootRef.child("users").child("12345678").child(phone); 
     ValueEventListener lastnameListener = new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       try { 
        yourid = dataSnapshot.getValue().toString(); 
       } 
       catch (NullPointerException e){ 
        //handle user not registered here 

       } 



DatabaseReference mBioReference = FirebaseDatabase.getInstance().getReference().child("users").child(yourid).child("status"); 
       ValueEventListener bioListener = new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         Status = dataSnapshot.getValue().toString(); 
         mTextField = (TextView) findViewById(R.id.status); 
         mTextField.setText(Status); 

        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }; 
       mBioReference.addValueEventListener(bioListener); 
} 
      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }; 
     mLastnameReference.addValueEventListener(lastnameListener); 

第1リスナーで待っている値はyouridです。ネストされたリスナーを実行するためのノードへのデータベース参照を取得するには、その値も必要です。しかし、私はこのコードを実行すると、両方が同時に実行されているように見えます。したがって、その時点でyouridが取得されていないように見えるため、ネストされたデータベース参照に対してnull例外が発生します。

答えて

2

共有するコードでは、ネストしたリスナーを接続する前に、users/12345678/$phoneという値が読み取られます。しかし、値は、あなたのコードが正しく処理されません。これは、nullの場合もあります:私はtry置き換えられてきた

DatabaseReference mLastnameReference = rootRef.child("users").child("12345678").child(phone); 
ValueEventListener lastnameListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     String id = String.valueOf(dataSnapshot.getValue()); 
     if (id != null) { 
      DatabaseReference mBioReference = FirebaseDatabase.getInstance().getReference().child("users").child(id).child("status"); 
      ValueEventListener bioListener = new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        Status = dataSnapshot.getValue(String.class); 
        mTextField = (TextView) findViewById(R.id.status); 
        mTextField.setText(Status); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        throw databaseError.toException(); 
       } 
      }; 
      mBioReference.addValueEventListener(bioListener); 
     } 
    } 
    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw databaseError.toException(); 
    } 
}; 
mLastnameReference.addValueEventListener(lastnameListener); 

- 正規ifcatchidチャンスを削除し、ローカル変数、作られているいくつかの他の部分あなたのコードのそれはnullにそれを設定します。また、これらの認可の問題を無視しないことをお勧めしますので、今度はonCancelledに例外がスローされます。

関連する問題