Цепляемся за следующую строку Logcat-а:
"Make sure the content of your adapter is not modified from a background thread, but only from the UI thread."
Далее видим в AsyncTask следующее:
@Override
protected Void doInBackground(Void... params) {
LINK = "here is link for json";
obj = Helpers.getJson(LINK);
if (obj != null) {
Helpers.refreshListView(obj, tempList);
}
return null;
}
Ошибка:
Helpers.refreshListView(obj, tempList); вызывается в методе doInBackground() которая выполняется в background thread!
Решение:
Вынести вызов refreshListView() в метод onProgressUpdate() AsyncTask-а (который уже выполняется на UI Thread!):
protected Void doInBackground(Void... params) {
// ...
publishProgress(new MyProgress(obj, tempList));
// ...
}
protected void onProgressUpdate(MyProgress... progress) {
if (progress.size() > 0) {
Helpers.refreshListView(progress[0].getObj(), progress[0].getTempList());
}
}
---
Upd: Подробнее - т.к. в UIThread надо передавать и obj и tempList - то для них нужно сделать класс-wrapper, например так - (каждый класс в своём файле, естественно)
public class LoadWall extends AsyncTask<Void, MyProgress, Void> {
// ...
@Override
protected Void doInBackground(Void... params) {
// ...
publishProgress(new MyProgress(obj, tempList));
// ...
}
@Override
protected void onProgressUpdate(MyProgress... progress) {
if (progress.size() > 0) {
Helpers.refreshListView(progress[0].getObj(), progress[0].getTempList());
}
}
// ...
}
/**
* Используется для передачи прогресса в UI-Thread
*/
public class MyProgress {
private final Object obj;
private final ArrayList<LinkedHashMap<String, String>> tempList;
public MyProgress(Object obj, ArrayList<LinkedHashMap<String, String>> tempList) {
this.obj = obj;
this.tempList = tempList;
}
public Object getObj() {
return obj;
}
public ArrayList<LinkedHashMap<String, String>> getTempList() {
return tempList;
}
}