2016-11-06 1 views
0

onCreate() 안에 아래 메소드를 넣습니다. 앱을 실행하면이 메소드가 실행됩니다. 하지만 ValueEventListener() 외부에서 mName을 얻으려고하면 null이 반환되고 앱이 다운됩니다.파이어베이스 검색 데이터 Null 외부 메서드

누구든지이 문제가 발생하는 이유를 알고 계십니까? 중포 기지가 여전히 데이터를 검색하지 않았기 때문에 당신이 시간에 아직이다

ValueEventListener postListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      UserDetails info = dataSnapshot.getValue(UserDetails.class); 
      Log.d(TAG, String.valueOf(dataSnapshot)); 

      mName = info.getName(); 
      **Log.d(TAG, mName); // HERE GET THE NAME** 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.w(TAG, "getUser:onCancelled", databaseError.toException()); 
     } 
    }; 
    mDatabase.child("Admin") 
      .child("Info") 
      .child(uid) 
      .addValueEventListener(postListener); 

    **Log.d(TAG, mName); // HERE GET NULL** 

답변

1

: 중포 기지 데이터를 도착하기 전에이 줄이 실행 된 이후

Log.d(TAG, mName); 

mName 현재 null입니다.

이 문제를 해결하려면 Log.d(TAG, mName)onDataChange 방법을 사용해야합니다. 그렇지 않으면 값을 아직 설정하지 않았으므로 (Firebase이 아직 값을 얻지 못했기 때문에) null이됩니다.

1

다른 사람들처럼 : Firebase 데이터베이스의 모든 데이터는 비동기 적으로 읽혀집니다.

수신기를 부착 한 후 청취자

를 장착하기 전에 :

예상 할 수 있습니다 무엇을 달리
Log.d(TAG, "Before attaching listener"); 
mDatabase.child("Admin") 
     .child("Info") 
     .child(uid) 
     .addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     Log.d(TAG, "In listener's onDataChange"); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Log.w(TAG, "getUser:onCancelled", databaseError.toException()); 
    } 
}); 
Log.d(TAG, "After attaching listener"); 

, 이것의 출력은 : 그것은 당신의 코드에 좀 더 로그 문을 추가하여이를보고 가장 쉬운 방법

내부 청취자의 onDataChange

비동기 동작을 처리하는 방법은 문제를 재구성하는 것입니다.

코드가 작성되었습니다. 먼저 데이터를로드 한 다음 로그합니다. 당신의 문제 재구성하면

는 "데이터가로드 될 때마다, 우리는 그것을 기록을"이 같은 코드를 얻을 : 그래서 데이터를 필요로하는 모든 코드가 필요

mDatabase.child("Admin") 
     .child("Info") 
     .child(uid) 
     .addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     UserDetails info = dataSnapshot.getValue(UserDetails.class); 
     Log.d(TAG, String.valueOf(dataSnapshot)); 

     mName = info.getName(); 
     Log.d(TAG, mName); 

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Log.w(TAG, "getUser:onCancelled", databaseError.toException()); 
    } 
}); 

onDataChange() 내부로 . 또는 사용자 정의 콜백 메소드를 만들고 onDataChange()에서 호출 할 수 있습니다. 그러나 로직은 항상 동일합니다. 데이터를 필요로하는 코드는 데이터가 사용 가능할 때 에서 트리거됩니다..

+0

대단히 감사드립니다. 대단히 감사합니다. 그러나 이것은 또 다른 질문을 던져줍니다. 어떻게 데이터를 그 자리에서 다른 활동으로 전달할 수 있습니까? onDataChange 메서드 안에 sqlite를 사용하여 데이터를 저장하려고했습니다. 하지만 그것을 검색하려면 응용 프로그램을 닫고 다시 열어야합니다. – user3606920

관련 문제