2017-02-18 1 views
0

아래 코드에서 알 수 있듯이 onDataChange() 내부의 retrievedValue을 출력합니다. 그러나 null을 반환하기 때문에 다른 곳에서 retrievedValue을 출력 할 수 없습니다.Firebase에서 값을 가져 오려고했지만 null이 되었습니까?

DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); 

ref.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 

     retrievedValue = (Long) dataSnapshot.getValue(); 

     System.out.println(retrievedValue); //this line works 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

System.out.println(retrievedValue); //this line returns null! How can I fix this? 

답변

1

이 라인은 null을 반환! 이 문제를 어떻게 해결할 수 있습니까?

비동기 코드가 작동하는 방식을 이해하지 못 하겠지만 ... 우선 null이 반환되지 않습니다. 은 (는)에 아직 할당되지 않았습니다.

코드는 이와 동일합니다.

DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); 
System.out.println(retrievedValue); //this line returns null! 

ref.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 

     retrievedValue = (Long) dataSnapshot.getValue(); 

     System.out.println(retrievedValue); //this line works 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

Firebase를 잘못 사용하기 때문에 해결할 것이 없습니다. 당신이 retrievedValue 필요한 경우

는, 당신은 일을 지우기 위해 예를 들어 onDataChange

(다른 방법을 통해처럼, 또는 후)에

private Long retreivedValue; // starts as null 

public static void updateSomething(Long data) { 
    System.out.println(data); // this line works 
} 

public static void main(String... args) { 
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); 

    ref.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      retrievedValue = (Long) dataSnapshot.getValue(); 

      updateSomething(retrievedValue); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
+0

덕분에 모든 관련 코드를 삽입해야합니다. 그렇다면 어떻게'retrieveValue'를 저장하여 다른 곳에서 사용할 수 있습니까? – Me123

+0

완벽하게 잘 저장하고 있습니다. ** onDataChange' 이후에 ** ** ** 값을 사용해야 만합니다. (내에서 "within"을 의미) –

+0

내 유일한 옵션은'onDataChange'에서'retrievedValue'를 사용하는 것입니까? – Me123

관련 문제