낭만 프로그래머
안드로이드(Android)에서 Rest 호출 후 UI 업데이트를 해야 할 경우 본문
안드로이드를 개발 하다가 보면 API를 호출해서 그 결과를 UI를 업데이트 하는 경우가 다반사 이다.
이때 경험하게 되는 것이 Thread 에러다.
//UI 업데이트를 메인 Thread만 해야 한다는 에러
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
// 메인 Thread에서 네트워크 통신을 시도 할 때 나오는 에러
android.os.NetworkOnMainThreadException
우선 네트워크를 통한 통신은 메인 Thread에서 할 수 없다. 그리고 UI 업데이트는 메인 Thread에서만 할 수 있다.
정말로 난감한 문제다. ㅜㅜ
이런 문제를 해결하기 위하여 Android에서는 UI를 업데이트 하기 위하여 runOnUiThread 를 제공하고 있다
아래의 예를 보면 쉽게 알 수 있을 것이다
Thread { // 1. 네트워크 통신을 위한 Thread 구현
try {
var lotNoModelList :ArrayList<LotNoModel> = ArrayList<LotNoModel>()
var responseData: String = APIHelper.getData("http://localhost:8080/data.do")
var dataArray: JsonArray = JsonParser.parseString(responseData).getAsJsonArray()
val gson = Gson()
for(i in 0 until dataArray.size()) {
val lotNoModel: LotNoModel = gson.fromJson(dataArray[i], LotNoModel::class.java)
lotNoModelList.add(lotNoModel)
}
runOnUiThread { // 2. UI 업데이트를 위한 runOnUiThread 구현
(binding.rvLotNo.adapter as LotNoAdapter).setLotNoModelList(ArrayList<LotNoModel>())
(binding.rvLotNo.adapter as LotNoAdapter).setLotNoModelList(lotNoModelList)
}
}
catch(e : Exception) {
e.printStackTrace()
}
}.start()