-1

我剛剛將離線持久性添加到我的應用程序。在onCreate()方法,我有這樣的代碼:NullPointerExeception嘗試訪問片段的onCreateView中的Firebase Datasnapshot數據

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()訪問時已被設置 - 因此爲空指針異常。

Firebase工程師主張使用onDataChange()方法中檢索的數據來保證一致性。也許你可以嘗試嗎?

+0

在'onDataChange()'方法內部使用這些數據不會像更新UI(這正是我想要做的)之類的東西,因爲在這一點上所有的視圖都是空的。 –

+1

如何將您的'mAuthListener'及其中的數據移動到'onCreateView()'方法?這對您的使用情況是否合理? –

+0

檢索和訪問onCreateView中的數據工作得很好。謝謝 –

相關問題