0

다른 Thread을 사용하여 어댑터의 List을 지우고 IndexOutOfBoundsException을 얻는 경우가 있습니다.ListView 및 스레드 안전을위한 사용자 지정 어댑터

내가 문제가 ListView를 작성 사용자 정의 어댑터의 과정의 중간에 어딘가가 있다고 가정, 두 번째 스레드 어딘가에 경계의 부족을 일으키는 원인이되는 list.size() 0을 반환하는 원인이 list.clear()를 호출합니다.

이 스레드 안전성을 동기화 된 상태로 만들려면 어떻게해야합니까 (문제를 해결할 수있는 경우)?

//onCreate 
fillList(list); // fills the list 
new AsyncTaskSubclass().execute(); // clear the list on a different Thread 

편집 : 나는 문제가 AsyncTask 어댑터가 사용하는 List을 변경할 수있는 방법이의 ArrayAdapter 서브 클래스가 사용하는 목록을 삭제된다는 사실에 온다 생각? 좀 더 코드를 가지고

List<Item> list = Collections.synchronizedList(new ArrayList<Item>()); 

답변

1

당신은 동기화 된 목록을 사용할 수 있습니다.

당신이 손실을 취소 할 때 doInBackground() 방법에 publishProgress()를 호출 한 다음 onProgressUpdate() (add() 또는 remove())이 명확해야합니까 AsyncTask를 사용하는 경우. UI 스레드 외부에서 UI 요소를 조작하지 마십시오.

왜 새로운 목록으로 새 어댑터를 설정하지 않습니까? 따라서 목록을 비동기식으로 요리 한 다음 UI 스레드에서 ListView.setAdapter()으로 전화하십시오 (예 : onProgressUpdate() 또는 onPostExecute()).

+0

서버에서 새 데이터를 가져 오는 중입니다. 따라서 목록이 지워지고 별도의 스레드에서 다시 채워집니다. 이 솔루션이 해당 상황에 적용됩니까? –

+0

아니요, 여전히 예외가 발생합니다. –

0

그것은 좋은 것 :

관련 문제