낭만 프로그래머

안드로이드(Android)에서 Rest 호출 후 UI 업데이트를 해야 할 경우 본문

카테고리 없음

안드로이드(Android)에서 Rest 호출 후 UI 업데이트를 해야 할 경우

조영래 2021. 12. 4. 02:51

안드로이드를 개발 하다가 보면 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()