개발 일기

Fragment recyclerView 관련 메모리 이슈 본문

Client/안드로이드

Fragment recyclerView 관련 메모리 이슈

이건욱

아래에 같은 그림에서는 다음과 같이 메모리 이슈가 있습니다.

class HomeFragment : Fragment() {

    private val adapter = Adapter()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? =
            inflater.inflate(R.layout.fragment_home, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
        recyclerView.layoutManager = LinearLayoutManager(this.context)
        recyclerView.adapter = adapter
    }
}

class ViewHolder(view: View) : RecyclerView.ViewHolder(view)

class Adapter : RecyclerView.Adapter<ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
            ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.view_item, parent, false))

    override fun getItemCount(): Int = 10

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        // Bind your data at this position to the view holder
    }

}

fragment LifeCycle

onAttach() -> onCreateView() -> onDestroyView() -> onDetach()

 

View LifeCycle

onCreateView() -> onDestroyView()

 

위에 같이 onStop()에서 서로를 참조할려고 할때 일반적으로 누수가 발견됩니다.

 

따라서 위에서는 Fragment -> Adapter -> RecyclerView 이렇게 서로 참고를 하고 있기에 메모리 누수가 있습니다.

 

그래서 다음과 같이 cycle을 끊을수 있습니다.

fun onDestroyView() {
  adapter = null // adapter is nullable
  super.onDestroyView()
}

or

fun onDestroyView() {
  view?.findViewById<RecyclerView>(R.id.recycler_view)?.adapter = null
  super.onDestroyView()
}

 

여기에서 참고했습니다.

'Client > 안드로이드' 카테고리의 다른 글

다중 창 지원  (0) 2020.04.03
coroutine ktx  (0) 2020.03.30
ViewModel  (0) 2020.03.27
Rxjava Subject  (0) 2020.03.26
Broadcast Receiver ?  (0) 2020.03.26
Comments