앱툴즈
46.♡.168.138
46.♡.168.129
46.♡.168.161
46.♡.168.136
46.♡.168.145
46.♡.168.162
46.♡.168.144
46.♡.168.140
115.♡.135.198
46.♡.168.139
 
게시물 88건
   
The content of the adapter has changed but ListView ... 에러 일반적 해결법.
글쓴이 : 김병주                   날짜 : 2013-04-16 (화) 16:39 조회 : 14274
오류내용은 
java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.

인것을 기준으로 합니다.

기본적으로 안드로이드는  1thread에 하위 thread들(부모-자식 쓰레드)로 동작하며 UI변경은 반드시 부모, 즉 현재의 mainThread에 의해 변경되어야 됩니다.

메인쓰레드 이외의 곳에서 다른 thread를 생성하여 이곳에서 처리하려고하면 100%오류를 발생시킵니다.

예를들어 thread를 이용해 리스트를 갱신한다고합시다. 이때, adapter.notifyDataSetChanged()를 사용하게 되면 위의 에러코드를 만나게 되실 겁니다.

해결하는 가장 쉬운방법으로는 runOnUiThread를 이용하여 하는 방식과 handler.post로 컨트롤 하는 방식이 있습니다.

runOnUiThread는

runOnUiThread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

adapter.notifyDataSetChanged();

}

});


handler는 


handler.postDelayed(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

try{

adapter.notifyDataSetChanged();

    }catch (Exception e) {

// TODO: handle exception

    }

 }

 }, 100);


두가지 방빕입니다.


물론 겨우 이것을 설명하고자 글을쓴건 아니지만 기본적인 사용은 위와같다는것이죠.


본론으로 돌아가서..


분명 쓰레드안에서 위의 runOnUiThread 혹은 Handler로 처리해서 갱신해도 위의 에러를 또 뱉는경우가


있습니다. 많은 개발자들이 자주 범하는 오류중에 하나가 바로 이 부분입니다.


위의 두가지방법으로 했는데도 만약 위의 오류가 발생한다면


다음을 확인해보시기 바랍니다.


1.ListView의 값이 변경되어 수정하고 adapter.notifyDataSetChanged(); 사용하고

  바로 리스트 스크롤을 수정함.


2. adapter.notifyDataSetChanged();를 사용하고 아래에 핸들러로 한번더 ListView스크롤 변경.


1번의 경우는 우선 list.setSelection과 adapter.notifyDataSetChanged();는


같이 사용할 수 없다는걸 말해드리겠습니다.


물론 같이 사용할 수는 있습니다. 다만 어뎁터의 변경이 언제끝나는지도 모르는데 .setselection을 이용해 


스크롤을 수정하면 중복해서 getView를 또 불러와 위의 에러를 뱉습니다.


같은 adapter.notifyDataSetChanged();를 여러번 부르는건 상관없습니다. 다만 adapter.notifyDataSetChanged();은 값이 변경되어있을경우 작동하지만 list.setSelection은 


무조건 작동합니다. 차이점이 크므로 반드시 구분하여 사용하시기 바랍니다.


두번째로는 runonuithread안에 또한번 handler로의 컨트롤입니다.


runon에서 adapter.notifyDataSetChanged(); 를 부르고 handler에서 setSelection 혹은 

리스트스크롤 변경을 하실 경우 에러가 발생될수 있습니다.


내용이 추가되거나 수정된 것을 보여주고 싶다면 그냥 단한번의 adapter.notifyDataSetChanged();


를 부르면되고 만약 갱신+ 스크롤을 하고 싶다면 단순히 setSelection만 불러주면 됩니다.


아무쪼록 리스트뷰 갱신하다가 위의 문제가 계속 발생한다면 어디선가 중복 갱신 및 리스트 스크롤 컨트롤하고 


있는 부분은 자제하시면서 작업하시기 바랍니다.


* 글을 등록하실때 꼭 필요한 경우가 아니면 개인정보를 남기지 마세요 ^^ (연락처,이메일주소,주민등록번호 등)




김병주 님의 Tip&Tech 최신글 [더보기]


   

게시물 88건
번호 제목 글쓴이 날짜 조회
88  <클라우드혁신센터> 12월 1일 SW 스타트업 창업 성공 전략 세미나 참석 요청 준모 11-30 2550
87  <클라우드혁신센터> 12월 1일 SW 스타트업 창업 성공 전략 세미나 준모 11-23 2483
86  개인개발자 SW개발환경 지원사업 안내 준모 10-28 2682
85  맥에서 구글 API key 등록방법 성기동 08-29 3575
84  [Agate Mobile] 앱 설치 없이 서버로부터 실시간 로딩 되어 동작하는 Cloud Native App 프레임워크입니다. 씨트린개발… 07-21 6324
83     [Agate Mobile] 앱 설치 없이 서버로부터 실시간 로딩 되어 동작하는 Cloud Native App 프레임워크입니다. 김은호 08-21 10877
82  자바 초보들에게 추천하는 기초 개념을 잡을 수 있는 책들 이경용 06-19 4719
81  [팁] 갤럭시 노트3 개발자 옵션 메뉴 찾기 ^^ 이경용 11-09 8627
80  앱템플릿을 제공하는 사이트 소개합니다. 씨트린개발… 08-21 11228
79  The content of the adapter has changed but ListView ... 에러 일반적 해결법. 김병주 04-16 14275
78  간단하게 패스워드에 숫자가 혼용되었는지 처리할 수 있는 메소드입니다. 김병주 01-31 5350
77  handler를 이용해 가변시간 반복 작업하기. 김병주 11-26 7257
76  String -> HEX 김병주 11-12 4639
75  리스트 작업시에 기본적으로 알아두셔야 될점. +1 김병주 10-08 5717
74  xml 직렬처리 고범석 09-24 3760
73  주소록 추가/삭제 감지해서 앱의 db추가/삭제하기. 김병주 09-24 11328
72  확장리스트가 3뎁스 이상이 될까? 안될까? +1 김병주 08-21 6504
71  ZXing 바코드 스캔부분 크기 조절하기. 김병주 08-06 13373
70  이클립스에서 레이아웃 xml 그래픽부분이 갑자기 안보일경우. +1 김병주 07-27 5330
69  간만에 글쓰네요 이번엔 launcherShortCut (바로가기 아이콘)입니다. 김병주 07-25 10894
 1  2  3  4  5  
 
 
 
Copyright ⓒ wwwold.androidstudy.co.kr. All rights reserved.