코루틴 통신 리사이클러뷰 오류

littlecsh·2024년 1월 31일

앱개발

목록 보기
13/16
post-thumbnail

카카오 REST API로 서버의 정보를 가져와 items변수에 담아주고 items를 리사이클러뷰로 보여주고 있는데 빈 화면이 출력되었다.

로그에 items를 찍어 확인해 보니 items에 데이터가 담기긴 하는데 담기기 전에 리사이클러뷰가 실행되면서 빈 화면이 출력되었던 것이다.

서버와 통신하는 과정은 메인 쓰레드에서 실행하지 않고 코루틴을 통해 실행하기 때문에 코루틴 쓰레드가 실행이 되더라도 메인쓰레드는 죽지 않고 계속 실행이 되면서 발생하는 문제이다.

메인 쓰레드에서 통신하지 않는 이유는 서버와 통신하는 과정에서 일정시간이 소요되기 마련인데 그동안에는 메인쓰레드에서의 작업들이 모두 멈춰 있게 되고, 그 시간에 8초가 넘어가게 되면 오류메세지를 띄우게 안드로이드시스템이 세팅되어 있기 때문에 별도의 쓰레드에서 통신을 하게 된다.

때문에 코루틴을 통해 다른 쓰레드에서 데이터를 주고 받는 시간이 리사이클러뷰가 실행되는 것보다 오래걸리면서 items에는 아무런 데이터가 담기지 않았던 것이다.

그래서 코루틴 쓰레드가 종료된 후 그 결과를 리사이클러뷰로 뿌려주게 코드를 변경해 주었다.

기존 코드

binding.btnImgListSearch.setOnClickListener {
	val searchText = binding.editImgListSearch.text.toString()

	communicateNetWork(searchText)

	adapter = Adapter(items)
	binding.recyclerImgList.adapter = adapter
	binding.recyclerImgList.layoutManager = GridLayoutManager(requireContext(), 2)
	//Log.d("ImageFragment", "item=$items")
}

private fun communicateNetWork(query:String) = lifecycleScope.launch() {
	val authKey = "KakaoAK 6b59faaf5abcd2b644ef4de2d858419f"
	val responseData = dustNetWork.getData(authKey,query,"recency",1,80)
	items=responseData?.documents!!
}

바뀐 코드

binding.btnImgListSearch.setOnClickListener {
	val searchText = binding.editImgListSearch.text.toString()

	lifecycleScope.launch {
		val responseData = communicateNetWork(searchText)

		if (responseData != null) {
			adapter = Adapter(responseData)
			binding.recyclerImgList.adapter = adapter
			binding.recyclerImgList.layoutManager = GridLayoutManager(requireContext(), 2)
			//Log.d("ImageFragment", "item=${responseData}")
		}
	}
}

private suspend fun communicateNetWork(query: String): MutableList<DataItem>? {
	val authKey = "KakaoAK 6b59faaf5abcd2b644ef4de2d858419f"
	val responseData = dustNetWork.getData(authKey, query, "recency", 1, 80)
	items=responseData?.documents!!
	return items
}
profile
앱개발 튜토리얼

0개의 댓글