-1

私のアプリケーションにオフラインパーシスタンスを追加したばかりです。 onCreate()メソッドでは、私は、このコードしている:フラグメントのonCreateViewのFirebase DatasnapshotデータにアクセスしようとするNullPointerExeception

mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      firebaseUser = firebaseAuth.getCurrentUser(); 
      if (firebaseUser != null) { 
       Log.e(TAG, "onAuthStateChanged:signed_in: " + firebaseUser.getUid()); 
       valueEventListener = new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         myUser = dataSnapshot.getValue(User.class); 

         city = myUser.getCity(); 
         username = myUser.getUsername(); 

         Log.d(TAG, city);       
         Log.d(TAG, username); 


        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }; 

       mDatabaseReference.child("users") 
         .child(firebaseUser.getUid()) 
         .addValueEventListener(valueEventListener); 
       mDatabaseReference.keepSynced(true); 

      } else { 
       Toast.makeText(mContext, "Could not load content at this time.", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }; 

cityusername(グローバル変数である)期待場合でもオフラインとしてlogcatに出力されます。

しかし、onCreateViewメソッドのいずれかにアクセスしようとすると、NullPointerExceptionが表示されます。 onCreateViewメソッドのFirebaseUserオブジェクトにアクセスしようとしてもnullが返されます。 onCreate()が呼び出されて以来、これは奇妙です。onCreateView()

答えて

0

これは、Firebase ValueEventListener()が非同期で動作することが原因と考えられます。

onCreateView()は、onCreate()メソッドの後に同期して実行されます。ただし、valueEventListenerの非同期性のため、グローバル変数がonCreate()がアクセスするまでに設定されていることを保証するものではなく、したがってNULLポインタ例外です。

ファイアベースのエンジニアは、整合性を保証するためにonDataChange()メソッド内で取得したデータを使用することを推奨します。多分あなたはそれを試すことができますか?

+0

このデータを 'onDataChange()'メソッド内で使用すると、UIの更新(これはまさに何をしようとしているのですか)のようには機能しません。 –

+1

あなたの 'mAuthListener'とその中のデータを' onCreateView() 'メソッドに移すのはどうですか?それはあなたのユースケースでもっともらしいですか? –

+0

onCreateViewのデータを取得してアクセスするだけで問題ありません。ありがとうございます –

関連する問題