프로젝트/소프트웨어공학

[소프트웨어공학] 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 때문인지 오류가 발생한다.

왜지?????

 

그만~~~~큼 콜백 지옥, 콜백, 비동기 찾고 듣고 했으면서 기본적인 구조도 못지키고 있었다;;

진짜 최최최종본