2013-03-12 5 views
1

Я пользуюсь сторонним облачным сервисом (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); 
+0

действительно зависит от того, где вы вызываете обновление из AsyncTack. Вы звоните из метода onPostExecute или метода doInBackground? Обновления пользовательского интерфейса всегда должны вызываться методом onPostExecute. –

+0

??? Никогда не использовал Кинви. Где вы обновляете содержимое адаптера? –

+0

@ G.BlakeMeike код, добавленный выше – AndroidEnthusiast

ответ

2

Отказ от ответственности: Я являюсь членом команды инженеров Kinvey в.

Проблема в том, что вы удаляете файл artistItemList перед удалением из бэкэнд Kinvey, а затем не вызываете adapter.notifyDatasetChanged до обратного вызова. Это приводит к задержке, которую вы заметили, когда базовый набор данных изменился во время ожидания обратного вызова из бэкэнда Kinvey delete call. Вы должны сгруппировать оба этих вызовы вместе, и сделать это одним из двух способов:

  1. Сделать artistID, что вы передаете удаления окончательного метода, и в OnSuccess, удалить элемент из artistItemList перед вызовом адаптера. notifyDatasetChanged.
  2. Вызовите адаптер.notifyDatasetChanged перед вызовом метода kinveyClient.appData(). Delete() сразу же после удаления элемента из artistItemList. Этот параметр может вызывать проблемы, если удаление не выполняется на внутреннем сервере Kinvey.
Смежные вопросы