Я пользуюсь сторонним облачным сервисом (Kinvey) для извлечения данных для своего приложения. Все методы Kinvey, которые обслуживаются, обернуты в асинхронные классы. В настоящее время я получаю журнал ошибок ниже, и я понимаю, почему я его получаю. Я просто не знаю, как решить проблему.Адаптер контента и асинхронные обратные вызовы
Ошибка:
03-12 13:41:03.449: E/AndroidRuntime(18375): FATAL EXCEPTION: main
03-12 13:41:03.449: E/AndroidRuntime(18375): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2130968661, class android.widget.ListView) with Adapter(class com.example.chartviewer.LazyAdapter)]
Вот отрезок моего кода, где я уведомит мой адаптер после удаления содержимого внутри метода асинхронной:
mKinveyClient.appData("artistdata", ArtistData.class).delete(artistID, new KinveyDeleteCallback() {
@Override
public void onSuccess(KinveyDeleteResponse result) {
Log.e("DELEET", "Data Deleted sucessfully");
Toast.makeText(getBaseContext(),
"Artist Deleted", Toast.LENGTH_SHORT).show();
//refreshes list
adapter.notifyDataSetChanged();
//displays dialog box if no artists left
displayNoArtist();
}
@Override
public void onFailure(Throwable error) {
Log.e("DELETE", "AppData.delete Failure", error);
}
});
Обновление адаптера:
mKinveyClient.appData("artistdata", ArtistData.class).get(myQuery, new
KinveyListCallback<ArtistData>() {
@Override
public void onSuccess(ArtistData[] result) {
Log.e("FETCHING", "Data fetched sucessfully");
for (ArtistData data : result) {
String name= data.getArtistname();
String imageurl = data.getArtisturl();
String id = data.getArtistid();
artistIds.add(id);
HashMap<String, String> hashMap = new HashMap<String, String>();
hashMap.put(TAG_NAME, name);
hashMap.put(TAG_IMAGEURL, imageurl);
addMyArtists(hashMap);
}
displayData();
}
@Override
public void onFailure(Throwable error) {
Log.e("FETCHING", "AppData.get by Query Failure", error);
}
});
адаптер код создатель:
list = (ListView)findViewById(R.id.artistlist);
adapter = new LazyAdapter(MyArtistsActivity.this,"artists", artistItemList);
list.setAdapter(adapter);
registerForContextMenu(list);
действительно зависит от того, где вы вызываете обновление из AsyncTack. Вы звоните из метода onPostExecute или метода doInBackground? Обновления пользовательского интерфейса всегда должны вызываться методом onPostExecute. –
??? Никогда не использовал Кинви. Где вы обновляете содержимое адаптера? –
@ G.BlakeMeike код, добавленный выше – AndroidEnthusiast