FrontEnd/Android

[Android Studio] 파이어베이스 데이터 로드 대기 (Wait to load data from firebase in android)

Satisfaction 2018. 1. 23. 02:31


"

English Explain exist below.

Please Scroll Down

"



파이어베이스는 서버가 필요하지만 번거롭거나, 백엔드 지식이 없을 때 사용할 수 있는 편리한 기능을 제공한다.


하지만 API에 있는 정보만으로는 원활한 개발에 상당히 어렵다는 것을 느낀 사람이 많을 것이다.

(가이드는 친절하지만 종종 더 자세한 설명을 얻고 싶을 때 API에서 찾아보면 "한 줄 설명"이 꽤나 많기 때문이다...)

(물론 그렇지 않은 사람도 많을 것이다.)


특히 데이터베이스의 데이터 입출력에 관해서, 데이터를 가져오는 경우 set메소드가 존재하지만

데이터를 내보낼 때는 get이 아닌 Listener를 활용하기 때문이다.


그래서인지 즉각적으로 데이터를 교환하기가 상당히 까다롭고, 검색으로도 해답을 찾기 상당히 힘들다...


StackOverflow에 해당 답변이 몇 개 있길래 읽어보았지만... 처음보는 클래스들과 어노테이션들로 도배되어 있는 데다가

설명도 매우 짧아서 사용하기 매우 꺼려져서 나름대로의 방법을 찾아 보았다.

(검색 키워드: how to wait to load data from firebase in android)


리스너를 등록하면, 데이터를 받아오는 순간에 성공/실패 여부에 따라서

리스너 내부에 있는 메소드가 호출되는데, 그 메소드 안에서 콜백 함수를 사용하는 방법이다.


public interface Callback{
void success(String data);
void fail(String errorMessage);
}

private DatabaseReference mDatabase= null;

public void loadData(String path, final Callback callback){

mDatabase = FirebaseDatabase.getInstance().getReference();
StringTokenizer token= new StringTokenizer(path, "/", false);
while(token.hasMoreTokens()){
mDatabase= mDatabase.child(token.nextToken());
}

// Read from the database
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
callback.success(dataSnapshot.getValue().toString());
}

@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
callback.fail(error.getMessage());
}
});
}


(//Read from the database 부터 참고하면 된다)

이런식으로, 데이터를 로드한 다음할 동작을 interface를 이용하여 

성공할 경우 할 동작(success)와 실패할 경우 할 동작(fail)을 기술하는 방법을 사용한다.


이렇게 하면, 데이터가 로드되기 전 까지 공백이 생기게 되는데, 그 때 로딩바를 보여준다던가 하는 방법으로 사용자에게 

앱이 멈춘것이 아닌 데이터를 로딩하는 중이라는 것을 알려주는 것이 좋다.


StackOverflow에 가보면 Semaphore를 사용하는 방법이나 Task Class를 사용하는 방법 등등이 있는데... 


우선 Semaphore를 이용하는 경우에는 release될 때까지 동작이 멈추기 때문에 별로 권장하는 방법은 아니다.


Task Class는 Google Conference에서 발표한 방법이라고 하는데, 다음에 시간이 되면 동영상으로 한번 살펴보아야 겠다.


(이 문제에 대한 해답을 얻지 못해서 프로젝트를 포기한 경력이 있기 때문에 시간이 되면 영어로도 설명을 추가할 예정이다.)


----------------------------------------------------------------------------------------


When get data from firebase in android, Not using "getter" but "Listener".


Listener is executed independently with main thread.


So, our app must be wait until data is arrived.


To implement this function, we use "callback method".




public interface Callback{
void success(String data);
void fail(String errorMessage);
}

private DatabaseReference mDatabase= null;

public void loadData(String path, final Callback callback){

mDatabase = FirebaseDatabase.getInstance().getReference();
StringTokenizer token= new StringTokenizer(path, "/", false);
while(token.hasMoreTokens()){
mDatabase= mDatabase.child(token.nextToken());
}

// Read from the database
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
callback.success(dataSnapshot.getValue().toString());
}

@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
callback.fail(error.getMessage());
}
});
}

< concentrate below "//Read from the database" >


loadData() is method that load data from firebase database.


The parameter of loadData() is path and callback.


path means database path.


For example, if you want to get data from "userdata/val", path is "userdata/val".


callback is description that descript action after loading.


Callback is interface that made with "void success(), void fail()".


You should implement callback, and pass as parameter of loadData().


Then, we can wait to load data from firebase.


But, Be aware!


Until loading data, user can't know "what happened".


Therefore, before loading data, tell "loading data..." to user by using progress bar.


And, In the method of callback, 

you should remove progress bar, show data that you want to appear to user.