[프로젝트] 베지도_0916 :: LiveData

hyihyi·2023년 9월 16일
0

베지도

목록 보기
7/7
post-thumbnail

문제점 하나!

리뷰와 블로그 리뷰가 서로 다른 리뷰들이 보여야 하는데 리뷰 창에서 보이던 리뷰들이 블로그 리뷰창에서도 똑같이 보이는 문제점이 생김

블로그 리뷰의 callBlogReviewAPI를 호출하는데 자꾸 리뷰의 callReviewAPI가 호출됨

callReviewAPI와 callBlogReviewAPI는 ActivityViewModel에 있는 같은 함수인 아래의 함수를 호출함. 이것이 주원인은 아니었고 아래의 코드에서 같은 라이브 데이터를 관찰하고 있기 때문이었다.
옵저버가 여러 번 추가되거나 다른 프래그먼트나 액티비티에서 동일한 LiveData를 관찰하고 있다면, 원치 않는 동작이 발생할 수 있다는 것을 알게 됨.

public void ReviewInquiryData(Long storeId, int count, int cursor, boolean blogReview) {
        //리뷰 조회
        Call<ReviewListInquiryResponseDTO> reviewListInquiryResponseDTOCall = reviewApiService.getReviews("Bearer " + token, storeId, count, cursor, blogReview);
        reviewListInquiryResponseDTOCall.enqueue(new Callback<ReviewListInquiryResponseDTO>() {
            @Override
            public void onResponse(Call<ReviewListInquiryResponseDTO> call, Response<ReviewListInquiryResponseDTO> response) {
                if (response.isSuccessful()) {
                    Log.d("LOGAPI", "ReviewAPI 호출성공1 "+response);
                    ReviewListInquiryResponseDTO responseData = response.body();
                    Log.d("LOGAPI", "ReviewAPI 호출성공2 "+ responseData.getReviews());
                    reviewLiveData.setValue(responseData);
                } else {
                    Log.d("LOGAPI", "ReviewAPI 호출실패2");
                }
            }

            @Override
            public void onFailure(Call<ReviewListInquiryResponseDTO> call, Throwable t) {
                Log.e("LOGAPI", "ReviewAPI 호출실패3 " + t.getMessage());
            }
        });
    }

1.해결책
: 블로그 리뷰와 일반 리뷰에 대해 각각의 LiveData를 생성하여 관찰

2.해결책
loadFragment()라고 따로 함수를 만들어놨었는데 이 함수 안에서 항상 StoreReviewFragment를 로드하는 것으로 구현해놨었다.

private void loadFragment(Fragment fragment) {
    StoreReviewFragment storeReviewFragment = StoreReviewFragment.newInstance(storeId);
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, storeReviewFragment); // R.id.fragment_container는 대상 컨테이너의 ID입니다. 실제 ID로 바꿔주세요.
    transaction.commit();
}

-> 아래의 코드로 바꿈

private void loadFragment(Fragment fragment) {
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, fragment); 
    transaction.commit();
}

loadFragment()를 호출하는 방식도 바꿈

reviewText.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      reviewText.setTypeface(null, Typeface.BOLD); // 글자를 bold로 설정
      blogReviewText.setTypeface(null, Typeface.NORMAL);
      reviewText.setTextColor(getResources().getColor(android.R.color.black)); // 글자를 검정색으로 설정
      blogReviewText.setTextColor(getResources().getColor(android.R.color.darker_gray)); // 글자를 검정색으로 설정
      loadFragment(new StoreReviewFragment());
      }
});

-> 아래의 코드로 바꿈

reviewText.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      reviewText.setTypeface(null, Typeface.BOLD); // 글자를 bold로 설정
      blogReviewText.setTypeface(null, Typeface.NORMAL);
      reviewText.setTextColor(getResources().getColor(android.R.color.black)); // 글자를 검정색으로 설정
      blogReviewText.setTextColor(getResources().getColor(android.R.color.darker_gray)); // 글자를 검정색으로 설정
      
      //바꾼 부분
      StoreReviewFragment storeReviewFragment = StoreReviewFragment.newInstance(storeId);
      loadFragment(storeReviewFragment);
      }
});
blogReviewText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        blogReviewText.setTypeface(null, Typeface.BOLD);
        reviewText.setTypeface(null, Typeface.NORMAL);
        blogReviewText.setTextColor(getResources().getColor(android.R.color.black));
        reviewText.setTextColor(getResources().getColor(android.R.color.darker_gray));      
        
        //바꾼 부분
        StoreBlogReviewFragment storeBlogReviewFragment = StoreBlogReviewFragment.newInstance(storeId);
        loadFragment(storeBlogReviewFragment);
    }
});

끄적끄적

저번주부터 인턴을 하고 싶다고 생각했고 오늘은 api 연동도 잘 되니 뭔가 코딩이 재밌다고 생각이 든다... 이상하다

profile
자유롭게 쓴 나의 자유로운 Development voyage⛵

0개의 댓글