私がやりたいこと:結果が計算されている間に、ListViewコンテンツを計算し、ListViewを部分的に更新するバックグラウンドスレッドを実行します。
私が回避しなければならないことを知っています:バックグラウンドスレッドからListAdapterの内容をいじることはできないので、onProgressUpdateからAsyncTaskを継承し、結果をパブリッシュ(アダプターにエントリを追加)します。私のアダプターは結果オブジェクトのArrayListを使用し、それらのarraylistのすべての操作が同期されます。
他の人の研究:ここには非常に貴重なデータがあります。また、約500人のユーザーのグループでほぼ毎日クラッシュすることもありlist.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
、onProgressUpdateにブロックを追加すると、クラッシュが10分の1に低下しましたが、消えることはありませんでした。(回答で提案されました)
私が時々得たもの:気づいてください、それは本当にまれにしか起こりません(3.5kユーザーの1人に1週間に1回)。しかし、私はこのバグを完全に取り除きたいと思います。ここに部分的なスタックトレースがあります:
`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(2131296334, class android.widget.ListView) with Adapter(class com.transportoid.Tracks.TrackListAdapter)]
at android.widget.ListView.layoutChildren(ListView.java:1432)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:2062)
at android.widget.ListView.onTouchEvent(ListView.java:3234)
at android.view.View.dispatchTouchEvent(View.java:3709)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
[...]
助けて?もう必要ありません。以下を参照してください
notifyDataSetChanged
最終的な回答:結局のところ、ちらつきや突然のリストの変更を回避するために、5回の挿入ごとに呼び出していました。そのように行うことはできません。ベースリストが変更された場合は、常にアダプタに通知してください。このバグは、長い間私にはなくなっていました。