우와테크

androidStudio 안드로이드 Only the original thread that created a view hierarchy can touch its views. 오류 본문

java-androidStudio

androidStudio 안드로이드 Only the original thread that created a view hierarchy can touch its views. 오류

uwaTech 2022. 6. 15. 15:39

오늘은 정말로 쓰레드 때문에 죽겠는 나날을 보내고 있는데 먼가 될 꺼같은 신의 개시를 받는 날이다.

 

결론은 저 오류가 떴다.

 

2022-06-15 15:23:05.087 31051-31280/"패키지명" E/AndroidRuntime: FATAL EXCEPTION: Thread-7
    Process: "패키지명", PID: 31051
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
        at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:9746)
        at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1841)
        at android.view.View.requestLayout(View.java:26339)
        at android.view.View.requestLayout(View.java:26339)
        at android.view.View.requestLayout(View.java:26339)
        at android.view.View.requestLayout(View.java:26339)
        at android.view.View.requestLayout(View.java:26339)
        at android.view.View.requestLayout(View.java:26339)
        at android.view.View.requestLayout(View.java:26339)
        at android.view.View.requestLayout(View.java:26339)
        at androidx.recyclerview.widget.RecyclerView.requestLayout(RecyclerView.java:4412)
        at android.view.ViewGroup.removeViewAt(ViewGroup.java:6235)
        at androidx.recyclerview.widget.RecyclerView$5.removeViewAt(RecyclerView.java:882)
        at androidx.recyclerview.widget.ChildHelper.removeViewAt(ChildHelper.java:168)
        at androidx.recyclerview.widget.RecyclerView$LayoutManager.removeViewAt(RecyclerView.java:8639)
        at androidx.recyclerview.widget.RecyclerView$LayoutManager.removeAndRecycleViewAt(RecyclerView.java:8912)
        at androidx.recyclerview.widget.RecyclerView$LayoutManager.removeAndRecycleAllViews(RecyclerView.java:10341)
        at androidx.recyclerview.widget.RecyclerView.removeAndRecycleViews(RecyclerView.java:1179)
        at androidx.recyclerview.widget.RecyclerView.setAdapterInternal(RecyclerView.java:1202)
        at androidx.recyclerview.widget.RecyclerView.setAdapter(RecyclerView.java:1161)

 

너무하지만... 해결은 되었다.

원인부터 해결까지 바로 알아보자.

 

원인

Thread 때문이다. 메인쓰레드에서 UI를 컨트롤 해야 하는데 지금 개발자가 만들어 놓은 쓰레드를 타다가 UI를 컨트롤하는 코드를 만나서 내보내는 오류이다.

 

 

 

해결
private void onSetList(ArrayList<ResponseBody> list) {
            AttachAdapter attachAdapter = new AttachAdapter(list);
            recyclerView.setAdapter(attachAdapter);
            attachAdapter.notifyDataSetChanged();
}

3번 줄에서 에러가 났다.

그렇기 때문에 3번줄을 포함한 2~4번줄을 아래와 같이 처리한다.

private void onSetList(ArrayList<ResponseBody> list) {
    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            AttachAdapter attachAdapter = new AttachAdapter(list);
            recyclerView.setAdapter(attachAdapter);
            attachAdapter.notifyDataSetChanged();
        }
    });
}

여기서 runOnUiThread는 이름에서도 알 수 있듯이 UI 스레드에서 지정된 작업을 실행한다.

참고로 onSetList 메소드가 Fragment 상에 있기 때문에 getActivity().을 앞에 붙혀줬다.

 

참조 :https://developer.android.com/reference/android/app/Activity#runOnUiThread(java.lang.Runnable)

 

 

 

 

 

 

 

 

다시 쓰레드랑 싸우러 가보겠다.ㅠ