Не вызывайте notifyDataSetChanged()
из любого другого потока, кроме основного потока.Просто удалите вызовы invalidate()
из doInBackground()
и вместо этого добавьте его в onPostExecute()
@Override
protected void onPostExecute(Void aVoid) {
Log.w("PROCESS EXECUTED", String.valueOf(profileList.size()));
invalidate();
}
ArrayList не должен изменяться при итерации по нему.Вместо использования метода remove()
в ArrayList, используйте метод remove()
в Итераторе.
Iterator<ProfileSearchResult> iter = profileList.iterator();
while (iter.hasNext()) {
ProfileSearchResult result = iter.next();
if(false == profileListNew.contains(result)){
iter.remove();
}
}
Также вы можете запускать несколько AsyncTasks одновременно, что может вызвать исключение ConcurrentModificationException, поэтому вы должны синхронизировать операции со списками с помощью блокировкитак что только один поток может изменять список одновременно.Добавьте этот синхронизированный блок к doInBackground()
в AsyncTask, как это
@Override
protected Void doInBackground(List<ProfileSearchResult>... lists) {
synchronized (profileList) {
Iterator<ProfileSearchResult> iter = profileList.iterator();
while (iter.hasNext()) {
ProfileSearchResult result = iter.next();
if(false == profileListNew.contains(result)){
iter.remove();
}
}
iter = profileListNew.iterator();
while (iter.hasNext()) {
ProfileSearchResult result = iter.next();
if(false == profileList.contains(result)){
profileList.add(result);
}
}
return null;
}
}