본문 바로가기

안드로이드/오류해결

[오류 해결] Fragment already added and state has been saved

반응형

게시판 UI를 개발하면서 발생한 문제에대한 해결방안 복기와 공유하기 위해 포스팅합니다. 구현한 UI는 간략하게 Activity에 Tablayout과 viewpager를 갖고 있고 viewpager는 recyclerview를 갖는 fragment들로 이루어져 있었습니다. 

게시판 ui

Activity에 진입시 게시판 메뉴를 호출하고, 메뉴 갯수만큼 페이지를 갖는 viewpager를 셋팅 했고 각 메뉴별 게시글들을 비동기 호출로 응답받아 기존에 생성된 fragment속 recyclerview를 업데이트 시켰습니다.

  ▶ 메뉴 호출 > fragment 생성 > 메뉴별 게시글 호출 > 각 recyclerview 업데이트

 

게시판의 메뉴가 많아서 viewpager는 양쪽 2개씩만 호출 하는 상황이었고( 많이 그릴수록 버벅임- 앱의 주 대상이 좋은 핸드폰이면 상관 없을듯 )  페이징시 fragment들은 다시 onCreate가 호출됐습니다. 그래서 pagerAdapter에서 아이템을 가져올때 각 포지션의 맞는 fragment가 널일 경우 새로 생성해서 리턴하는 방식으로 했고 fragment를 생성할땐 번들을 통해 포지션에 맞는 아이템을 전달 했습니다.

inner class BPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {


        override fun getItem(position: Int): Fragment {

            if (!fragments.containsKey((position))) {
                fragments.put((position), AFragment.newInstance(this@CActivity, items[(position)], menuItems[(position)]))
            }
            return fragments[(position)]!!
        }

        override fun getCount(): Int {
            return menuItems.size
        }

    }

첫번째 문제

번들로 전달하는 아이템(게시글들)의 데이터양이 클 경우 에러가 발생 했습니다. 이미지나 비트맵과 같이 번들로 아이템을 전달할 경우 너무 큰 아이템을 전달하지 않도록 주의해야합니다 ( 많은 데이터양도 주의 ) 

 

두번째 문제

fragment가 생성되고 뒤늦게 응답 받은 아이템들을 업데이트 시켜주고 다시 생성됐을때도 갖고 있기 위해 번들을 업데이트 했습니다. 이 방식으로 인해 'Fragment already added and state has been saved' 문제가 발생했는데, 재현 상황으로는 '게시판 화면으로 들어올때 게시판에 진입할 수 있는 푸시를 받아 클릭하는 경우' 즉 2번 게시판 화면에 진입하는 경우 해당 문제가 됐습니다.

( 게시판 화면은 singletask로 작업했습니다. )

	var bundle = Bundle()
	bundle.putParcelable(KEY_ITEM,items)
	bundle.putParcelable(KEY_MENU_ITEM,menuItem)
	arguments = bundle

 

해결방안 

현재 코드는 mvp로 구현됐지만 mvvm으로 구현해 데이터를 갖는 레파지토리를 프래그먼트와 엑티비티가 공유하면 간단하게 해결될수도 있습니다. 하지만 베이스 작업중이기에 추후에 적용하도록 하고 차선책으로 게시판 아이템들을 activity에서 보관하고 필요시 프래그먼트에서 getActivity로 접근해 뷰를 업데이트 하도록 변경 했습니다.

 

추후 문제가 재발하거나 다른 곳에서 발견된다면 그 또한 정리하도록 하겠습니다.

문제를 고치는것도 중요하지만 포스팅 하면서 정리되는 내용으로 반복되는 실수를 줄일 수 있으면 좋겠습니다.

 

다른 분들이 같은 상황이긴 어렵겠지만 비슷하게 유추해 문제를 해결했으면 좋겠고 궁금하거나 이해가 안가시는 부분은 댓글 남겨주시면 감사하겠습니다. 이의도 달게 받겠습니다.

 

 

 

반응형