Android

[Android 오류] API통신,UI오류 runOnUiThread메소드로 해결하다.

곽코딩루카 2023. 12. 3. 18:54
반응형

나는 글을 못쓰고 업무중에 대충쓰는거라 이해가 글이 엉망이다 이해부탁. 자세한건 문의줘라. 일이 너무 많다...

 

@Override
public void onResponse(Call call, Response response) throws IOException {
    if (response.isSuccessful()) {
        String responseBody = response.body().string();
        runOnUiThread(() -> {
            try {
                JSONObject responseObject = new JSONObject(responseBody);
                String email = responseObject.optString("email", "");        //이메일
                String location = responseObject.optString("location", "");  //주소
                String tellNo = responseObject.optString("tellNo", "");      //전화번호
                String userName = responseObject.optString("userName", "");  //유저 이름

                emailEditTextView.setText(email);
                locationEditTextView.setText(location);
                tellNoEditTextView.setText(tellNo);
                nameEditTextView.setText(userName);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        });
    }
}

 

우선 필자는 runOnUiThread를 안쓰고 바로 try catch문으로 각 텍스트 뷰에 API응답받은 값을 넣어주었다.(UI와 관련되었다.)

 

 

 

오류원인

 

메소드 내에서 UI 요소를 직접 업데이트하고 있습니다. 네트워크 응답은 백그라운드 스레드에서 수행되므로, UI 요소를 업데이트할 때는 메인 스레드에서 실행되어야 합니다. runOnUiThread 메소드를 사용하여 UI 업데이트 코드를 메인 스레드에서 실행하도록 변경하는 것이 좋다고 한다.

 

runOnUiThread 메소드는 안드로이드에서 매우 중요한 역할을 한다. 안드로이드 앱은 기본적으로 두 가지 유형의 스레드를 사용합니다: 메인 스레드(UI 스레드)와 백그라운드 스레드입니다. UI 스레드는 사용자 인터페이스와 관련된 작업을 처리하며, 앱의 사용자 인터페이스를 변경하거나 업데이트하는 모든 작업은 이 스레드에서 실행되어야 한다.

 

runOnUiThread란?

runOnUiThread의 중요성

  1. 스레드 안전성: 안드로이드는 UI 컴포넌트(예: TextView, Button 등)의 스레드 안전을 보장하지 않습니다. 즉, 메인 스레드가 아닌 다른 스레드에서 UI 컴포넌트를 직접 조작하면 앱이 예기치 않게 중단될 수 있습니다.
  2. 메인 스레드와의 동기화: runOnUiThread 메소드는 메인 스레드와의 동기화를 보장합니다. 이는 백그라운드 스레드에서 수행된 작업 결과를 메인 스레드의 UI 요소에 반영할 때 중요합니다.

 

 

 

해결방법

 

이 오류는 일반적으로 UI 요소가 예상과 다르게 접근되거나 수정될 때 발생한다. 안드로이드에서 UI 요소는 메인 스레드(UI 스레드)에서만 안전하게 업데이트될 수 있으며, 백그라운드 스레드에서 직접적인 UI 조작을 시도하면 이러한 오류가 발생할 수 있다.

로직상의 문제가 아니라 스레딩 문제로 보이는 이러한 상황에서는, runOnUiThread를 사용하여 백그라운드 스레드에서 수행된 작업의 결과를 안전하게 메인 스레드의 UI에 반영할 수 있습니다. 이러한 점을 바탕으로, 문제를 해결할 수 있었다.

 

1. runOnUiThread() 란?

안드로이드 OS는 UI 자원에 Main Thread와 Sub Thread가 동시 접근하여 동기화 이슈를 발생시키는 것을 방지하기 위해 UI 리소스 사용은 UI Thread에서만 가능하도록 만들었습니다. 안드로이드에서 제공하는 Message나 Runnable 객체를 UI 스레드 쪽에서 사용하는 방법은 4가지가 있습니다.

 

 

반응형