일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 방통대
- 린개발론
- 테스팅원리
- 컴퓨터과학개론
- 공부하는직장인
- 언덕오르기탐색
- 결함테스팅검증테스팅차이
- kiss원칙
- 정의
- 검증테스팅
- 모바일앱프로그래밍
- 결함테스팅
- 시험공부
- 정처기준비
- 정보처리기사
- 균일비용탐색
- 프로그래밍패러다임
- 프로그래밍
- 린소프트웨어개발론
- 소프트웨어공학
- 컴퓨터과학과
- 수제비
- 프로그래밍언어패러다임
- A* 알고리즘
- 비전공자
- 정처기
- 개발자
- 소프트웨어테스트
- 한국방송통신대학교
- 정보처리산업기사
- Today
- Total
우와테크
androidStudio 안드로이드 Only the original thread that created a view hierarchy can touch its views. 오류 본문
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)
다시 쓰레드랑 싸우러 가보겠다.ㅠ