Я получаю эту ошибку: java.lang.IllegalStateException: Содержимое адаптера изменилось, но ListView не получил уведомление. Убедитесь, что содержимое адаптера не изменено из фонового потока, но только из потока пользовательского интерфейса. [в ListView (2131034188, класс android.widget.ListView) с адаптером (класс .MainActivity $ ListAdapter)]android - Содержимое адаптера изменилось, но ListView не получил уведомление
Это то, что я делаю, я запускаю AsyncTask и получаю данные json, затем, onPostExecute, я вызываю ListAdapter, который делает данные в listview.
@Override
protected Void doInBackground(Void... arg0) {
Spots_tab1_json sh = new Spots_tab1_json();
String jsonStr = sh.makeServiceCall(url + page, Spots_tab1_json.GET);
if (jsonStr != null) {
JSONObject jsonObj = new JSONObject(jsonStr);
contacts = jsonObj.getJSONArray(TAG_CONTACTS);
for (int i = 0; i < contacts.length(); i++) {
JSONObject c = contacts.getJSONObject(i);
String onvan = new String(c.getString("onvan").getBytes("ISO-8859-1"), "UTF-8");
String id = new String(c.getString("id").getBytes("ISO-8859-1"), "UTF-8");
String dates = new String(c.getString("dates").getBytes("ISO-8859-1"), "UTF-8");
String price = new String(c.getString("gheymat").getBytes("ISO-8859-1"), "UTF-8");
HashMap<String, String> contact = new HashMap<String, String>();
contact.put("onvan", onvan);
contact.put("img", new String(c.getString("img").getBytes("ISO-8859-1"), "UTF-8"));
contactList.add(contact);
}
}
}
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (!isCancelled() && goterr == false) {
final ListAdapter ladap=new ListAdapter(MainActivity.this, contactList);
lv.setAdapter(ladap);
runOnUiThread(new Runnable() {
public void run() {
ladap.notifyDataSetChanged();
}});
}
}
и после этого мой списокView построен. Я протестировал его на нескольких разных устройствах, но у них не было проблем, но некоторые пользователи сказали мне, и я зашел в систему и увидел эту ошибку.
Что делать, чтобы решить эту проблему? что не так ?
благодарит вас
Почему 'runOnUiThread (...)'? вы обычно можете вызвать 'ladap.notifyDataSetChanged()' – Rustam
'onPostExecute (...)' запускается непосредственно в потоке 'UI'. – Rustam
Можете ли вы показать 'doInBackground()' тоже? Более конкретно, вы можете модифицировать 'contactList' там, который предположительно по-прежнему привязан к адаптеру. Это может, кстати, привести к незаконному состоянию, когда адаптер получает доступ, когда он был/изменен в фоновом потоке и до того, как «onPostExexute()» будет удалено. –