2016-03-22 4 views
0

Я написал класс, который ищет определенные файлы в папке и сохраняет их адрес (плюс 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 быть полезным?

ответ

1

Вам нужно будет переопределить этот метод внутри асинтезы и на постэксплуатацию, которая выполняется на потоке ui. Вы не можете обновить адаптер от ui Thread.

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 
    return null; 
    } 

@Override 
protected void onPostExecute(Void aVoid) { 
    super.onPostExecute(aVoid); 

     adapter.refresh(); 
    } 
} 

Обычно, когда вы работаете в разных потоках, вы не можете взаимодействовать с элементами ui. Обычная практика заключается в использовании postExecute в Asynctask.Post execute вызывается сразу после завершения doInbackground и вызывается в потоке пользовательского интерфейса, где вы можете делать все ваши связанные с Ui вещи.

+0

теперь его работа ... не может поверить, что потратил полдня на это. Я не понимаю, почему он работал над небольшим набором файлов. –

Смежные вопросы