프로젝트/소프트웨어공학
[소프트웨어공학] Android Studio 이슈 #3
dekoms
2023. 11. 24. 16:33
키워드: 비동기 함수, 콜백
와우.. 드디어 비동기 함수에 대해 이해를 했다. 역시 사람은 대가리 박으면서 해봐야 정신을 차린다.
ExecutorService service = Executors.newSingleThreadExecutor();
=> 하나의 쓰레드를 사용하여 동기적으로 처리하게 한다.
하지만, 결국 쓰레드 사용하기 어려워서 다른 방법 사용함.
- AsyncTask
public class CalendarAsync extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... voids) {
stringDateList = new HashSet<>(42);
databaseReference.child("TodoCell").child("wogns").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
stringDateList.clear();
for(DataSnapshot children: snapshot.getChildren()){
stringDateList.add(children.getKey());
}
calendarAdapter.notifyDataSetChanged();
Log.e("HashSet", "HashSet 크기: " + stringDateList.size());
for(String i:stringDateList)
Log.e("sequence", ">> "+i);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
//디비를 가져오는 중 에러 발생 시
Log.e("FirebaseTodoCell", String.valueOf(error.toException()));
}
});
return null;
}
@Override
protected void onPostExecute(Void unused) {
//화면 설정
setMonthView(todoList, todoListAdapter, databaseReference, stringDateList);
preBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
currentDateInfo.add(Calendar.MONTH, -1);
setMonthView(todoList, todoListAdapter, databaseReference, stringDateList);
}
});
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
currentDateInfo.add(Calendar.MONTH, 1);
setMonthView(todoList, todoListAdapter, databaseReference, stringDateList);
}
});
}
}
=> Deprecated 함수라는데.. ㅎ 상관없겠지
이제 비동기 함수를 깔끔하게 처리하기 위해서 다음과 같이 코드를 수정했다.
public class CalendarAsync extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... voids) {
firebaseAuth = FirebaseAuth.getInstance(); //파이어베이스 인증 초기화
firebaseUser = firebaseAuth.getCurrentUser(); //현재 인증처리된 객체 가져오기
//현재 사용자 닉네임 가져오기
String userKey = firebaseUser.getUid();
databaseReference.child("UserAccount").child(userKey).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot userDatas : snapshot.getChildren()){
UserAccount user = snapshot.getValue(UserAccount.class);
currentUser = user.getName();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.e("FirebaseCurrentUser", String.valueOf(error.toException()));
}
});
stringDateList = new HashSet<>(42);
databaseReference.child("TodoCell").child(currentUser).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
stringDateList.clear();
for(DataSnapshot children: snapshot.getChildren()){
stringDateList.add(children.getKey());
}
//어댑터 새로고침, 데이터 변경 반영
calendarAdapter.notifyDataSetChanged();
Log.e("HashSet", "HashSet 크기: " + stringDateList.size());
for(String i:stringDateList)
Log.e("sequence", ">> "+i);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
//디비를 가져오는 중 에러 발생 시
Log.e("FirebaseTodoCell", String.valueOf(error.toException()));
}
});
return null;
}
@Override
protected void onPostExecute(Void unused) {
//화면 설정
setMonthView(todoList, todoListAdapter, databaseReference, stringDateList);
preBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
currentDateInfo.add(Calendar.MONTH, -1);
setMonthView(todoList, todoListAdapter, databaseReference, stringDateList);
}
});
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
currentDateInfo.add(Calendar.MONTH, 1);
setMonthView(todoList, todoListAdapter, databaseReference, stringDateList);
}
});
}
}
=> 흠.. currentUser 때문인지 오류가 발생한다.
왜지?????
그만~~~~큼 콜백 지옥, 콜백, 비동기 찾고 듣고 했으면서 기본적인 구조도 못지키고 있었다;;
진짜 최최최종본