0
@
Override
protected Boolean doInBackground(final String...params) {

    runOnUiThread(new Runnable() {
            public void run() {

問題は、AysncTask が実行され、onPostExecute() が呼び出されたとき (どこでmAllResultsAdapter.notifyDataSetChanged(); 呼び出されたか) ですthe Adapter has not bound to ListView yet。以下の例外が発生します。

java.lang.IllegalStateException: アダプターの内容が変更されましたが、ListView は通知を受け取りませんでした。アダプターのコンテンツがバックグラウンド スレッドからではなく、UI スレッドからのみ変更されていることを確認してください。[ListView(2131034153、class android.widget.ListView) with Adapter(class com....tracebuzz.allresults.AllResultsAdapter)]

問題は、ArrayList私にバインドされているAdapterものがバックグラウンド スレッドで変更されることです。

アダプターの内容が変更されたが、ListView が通知を受信しなかった - With AsyncTask

上記の問題は私の正確な状況ですが10 ArrayList、バックグラウンドスレッドでそのような変更があり10 Adapaters、通知が必要な場合に適用する方法がわかりません.

4

4 に答える 4

0

私は同じ問題を抱えていました。runOnUiThread を含む多くのことを試しましたが、最善の解決策は、AsyncTask で一時的な ArrayList を作成して doInBackground() に入力することだったと思います。次に、これらすべての要素を実際の ArrayList にフラッシュし、onPostExecute() メソッド (UI スレッドで実行) でアダプターに通知することができます。

于 2013-06-12T15:25:54.340 に答える
0

notifyDataSetChanged を非同期タスクの onPostExecute メソッドに移動するだけです。このメソッドは、doInBackground の完了後に UI スレッドで実行されます。そうすれば、アダプターのコンテンツをバックグラウンドでダウンロードして更新し、UI スレッドで実際のビューを更新するだけです。

于 2013-06-12T15:20:29.843 に答える
0

バックグラウンド スレッドでアダプター データを変更しないでください。UI スレッドでのみ変更してください。バックグラウンド スレッドはローカル変数リストを作成し、onPostExecute または runOnUiThread によってリストをアダプタのリストにコピーし、notifyDataSetChanged を呼び出す必要があります。

于 2013-06-12T15:20:06.487 に答える
0

AsyncTask の ui Thread でコードを実行できるはずです。

コンテキストにアクセスできない場合は、使用してください

new Handler(Looper.getMainLooper()).post(youRunnable);
于 2013-06-12T15:22:00.150 に答える