Я написал класс, который ищет определенные файлы в папке и сохраняет их адрес (плюс 3 других атрибута) для общих настроек, а затем в моем пользовательском адаптере я делаю вызов метода (метод (который называется getAllItems) считывает данные из общих настроек, создает новые пользовательские объекты и добавляет их в список и возвращает список. Это та самая самая большая загрузка), то адаптер использует этот список элементов для получить адрес от каждого отдельного элемента, сгенерировать Bitmap и показать их в recyclerView это ошибка я получаю:Как настроить адаптер recyclerView асинхронно
E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1
Process: com.amir.example, PID: 4968
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:787)
at java.util.HashMap$KeyIterator.next(HashMap.java:814)
at com.android.internal.util.XmlUtils.writeSetXml(XmlUtils.java:355)
at com.android.internal.util.XmlUtils.writeValueXml(XmlUtils.java:693)
at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:300)
at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:269)
at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:235)
at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:192)
at android.app.SharedPreferencesImpl.writeToFile(SharedPreferencesImpl.java:600)
at android.app.SharedPreferencesImpl.-wrap2(SharedPreferencesImpl.java)
at android.app.SharedPreferencesImpl$2.run(SharedPreferencesImpl.java:515)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
теперь, когда количество файлов невелико (например, 20 совпадений из 100 файлов), приложение работает нормально, но когда их слишком много (например, из 200 элементов из 8000 файлов), приложение вылетает
Я попытался загрузить элементы в адаптер асинхронно: это в MainActivity.java
public class AsyncAdapter extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
//This line will load the files into shared preferences (DataSource is my sharedPreferences)
Loader.loadPhoneStickers(adapter.getDataSource());
//this will cause the list that the adapter is attached to, to get updated and load all the items that were added to shared preferences
//this method will make a call to getAllItems and notifyItemRangeChanged
adapter.refresh();
return null;
}
}
но ошибка остается тем же делать ли я установить адаптер асинхронно (установка адаптера будет вызывать все загрузки иметь место) или синхронно
где я должен делать загрузку? будет otto быть полезным?
теперь его работа ... не может поверить, что потратил полдня на это. Я не понимаю, почему он работал над небольшим набором файлов. –