从后台线程更新适配器

我的一些用户(可能是50个)因以下错误而崩溃:

java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知。 确保不从后台线程修改适配器的内容,而只是从UI线程修改。

如果我理解正确,那是因为调用adapter.clear();adapter.addAll(list); 在AsyncTask的doInBackground()方法中,我需要在onPostExecute()移动它。

问题是我无法重现那个错误,所以我无法确定它是否已修复。 StackOverflow上的一些类似问题似乎表明,简单地将适配器更新到onPostExecute()方法并不能解决问题。

有谁知道我怎么能在我的设备上每次都发生这个错误,以确保修复工作? 我不明白为什么它在大多数情况下会起作用,但有时只会导致崩溃。

简单回答:您忘记调用adapter.notifyDatasetChanged()

通知附加的观察者基础数据已被更改,反映数据集的任何视图都应自行刷新。

在后台获取数据并在onPostExecute()更新适配器,因为您永远不应该从后台线程更改适配器的内容。 onPreExecute()onPostExecute()都在UI线程上执行。

要重现此问题,请在doInBackground()中更改适配器后尝试hibernate。

例如:

  @Override protected Void doInBackground(Void... params) { adapter.clear(); try { Thread.sleep(5000); } catch(InterruptedException e){} return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); adapter.notifyDatasetChanged(); } 

你不应该在doInBackground(..)方法中调用任何UI东西。 只需在onPostExecute(..)以及onPreExecute(..)中调用它们

例如

  @Override protected void onPostExecute(Void result) { super.onPostExecute(result); adapter.clear(); } 

根据AsyncTask文档,在“The 4 steps”段落中。

onPostExecute(Result),在后台计算完成后在UI线程上调用。 背景计算的结果作为参数传递给该步骤。

试试这个..

 runOnUiThread(new Runnable() { @Override public void run() { adapter.notifyDatasetChanged(); } });