私がしたいこと:結果が計算されている間、ListView の内容を計算し、ListView を部分的に更新するバックグラウンド スレッドを実行します。
避けなければならないことがわかっていること: バックグラウンド スレッドから ListAdapter の内容をいじることができないため、AsyncTask を継承し、onProgressUpdate から結果を発行 (アダプターにエントリを追加) しました。私のアダプターは、結果オブジェクトの ArrayList を使用します。これらの arraylist に対するすべての操作は同期されます。
他の人々の調査: ここには非常に貴重なデータがあります。また、約 500 人のユーザーのグループでほぼ毎日のクラッシュに悩まされていましlist.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
た。onProgressUpdate にブロックを追加すると、クラッシュは 10 分の 1 に減少しましたが、消えることはありませんでした。(回答で提案されました)
私が時々得たもの:注意してください、それは本当にめったに起こりません(3.5kユーザーの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 回の挿入ごとに呼び出していました。このような方法では実行できません。ベース リストが変更された場合は常にアダプターに通知してください。このバグは、今では長い間なくなっています。