runOnUiThread 개념 및 사용


UI Thread 외부에서 UI를 호출해 작업하려다보니 에러가 발생하는데


android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.


이게 안드로이드 OS 는 UI 자원 사용을 UI Thread에서만 가능하도록 만들었기 때문에 


외부에서 접근하여 작업하려다보니 생기는 에러라고 한다.


손쉽게 runOnUiThread를 이용하여 외부에서 접근하는 방법에 대해 알아보자.


Activity의 runOnUiThread를 이용하여 해당 작업을 UI Thread를 호출해 작업하면


에러없이 잘 작동한다.

new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable(){
@Override
public void run() {
// 처리할 작업 내용
}
});
}
}).start();

근데 내가 하려는건 다른 클래스에서의 UI작업이라 Activity가 아니라서


runOnUiThread를 호출할 수 없는 상황이였다...


그래서 보통 다들 전달해주는 Context를 이용하여 runOnUiThread를 호출하였더니 잘되더라;


new Thread(new Runnable() {
@Override
public void run() {
((MainActivity)mContext).runOnUiThread(new Runnable(){
@Override
public void run() {
// 처리할 작업 내용
}
});
}
}).start();

뭔가 더 있을지 모르겠지만 현업에서 보는 코드는


일단 new Thread를 쓰지않고 바로 runOnUiThread를 호출하는 방법도있다.


일단 구현되있는 방법이라 잘 돌아가는거같은데


원리는 잘 모르겠다.


private void processMethod() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//작업 내용
}
});
}

반응형
  1. 123 2021.11.29 12:57

    mContext 가 에러가 나는데 어떻게 하면 좋을까요? ㅠㅠ

    • BlogIcon 썸머워즈 2021.12.04 10:10 신고

      mContext는 Context 객체를 주입받은 변수라 Context객체를 사용하셔야합니다!