화면 전체를 탭바와 리스트 뷰로 구성을 하였고

리스트 뷰는 쓰레드를 통해서 서버로부터 데이터를 받습니다.


받는 데이터가 이미지+텍스트 이 형태라서


텍스트를 먼저 받은뒤 

리스트의 invalidateViews()를 해서 화면을 갱신했습니다

리스트어뎁터의 notifyDataSetChanged()를 쓰지 않는 이유는 이걸 쓰면 리스트가 최상단으로 올라가버리길래 

리스트 스크롤이 내려간 상태에선 올라가는거 방지하기위해 invalidateViews를 이용햇습니다.


텍스트전송이 끝난뒤에 이미지들만 받기위해서

반복문으로 이미지를 하나 받은뒤 또다시 invalidateViews()를 시켜서 화면을 구성했습니다.




전체적으로 이렇게 구성되어 있는데


문제가 쓰레드에서 갱신하는 방법이 틀린건지 잘될때는 잘 되다가

안될때는 다음같은 로그를 뛰우고 죽어버립니다.


06-18 04:41:55.054: ERROR/AndroidRuntime(268): 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. [in ListView(2131165240, class android.widget.ListView) with Adapter(class com.smartcolor.ticketbene.ActivityGeneralList$GeneralListAdapter)]


제가 알기로 이거는 메인 쓰레드가 아닌 쓰레드에서 UI를 건들어서 죽는걸로 알고 있는데
데이터를 받는 쓰레드는 리스트를 갱신할때 핸들러를 통해서 갱신하고 있습니다.

private class UiHandler extends Handler{

public void dispatchMessage(Message msg) {

super.dispatchMessage(msg);

switch(msg.what){

case handlerMsgReloadListView:

listView.invalidateViews();

break;

}

}

}


핸들러 본체는 이렇게 되어있고 쓰레드는 


public void run(){


텍스트 데이터 다운완료


uiHandler.sendEmptyMessage(handlerMsgReloadListView);

이미지 데이터 다운 시작

for(){

이미지 1개 다운 완료

uiHandler.sendEmptyMessage(handlerMsgReloadListView);

}

}


이렇게 되어있는데...죽는 이유를 당최 못잡겟습니다.


고수님들 좀 도와주세요 ㅠㅠ


아참 그리고 list.invalidateViews() 말고 또 화면을 갱신시키는 다른 방법이 존재하는지 궁금합니다.

<meta charset="utf-8"><meta charset="utf-8">