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);
4

1 に答える 1

2

免責事項: 私は Kinvey のエンジニアリング チームの一員です。

問題は、Kinvey バックエンドから削除する前に artistItemList から削除し、コールバックまで adapter.notifyDatasetChanged を呼び出さないことです。これにより、バックエンドの Kinvey 削除呼び出しからのコールバックを待機している間に、基になるデータセットが変更された場所に気付いた遅延が発生します。これらの呼び出しの両方をグループ化し、次の 2 つの方法のいずれかで行う必要があります。

  1. delete メソッドに渡す artistID を final にし、onSuccess で、artistItemList から項目を削除してから、adapter.notifyDatasetChanged を呼び出します。
  2. artistItemList からアイテムを削除した直後に、kinveyClient.appData().delete() メソッドを呼び出す前に、adapter.notifyDatasetChanged を呼び出します。このオプションは、Kinvey バックエンドで削除が失敗した場合に問題を引き起こす可能性があります。
于 2013-03-12T19:04:26.640 に答える