【发布时间】:2017-03-28 13:10:55
【问题描述】:
我在更新我的 recyclerview 时遇到了问题,通知数据集已更改,因为它会在调用时将 ui 挂起几秒钟。 网上搜索后,建议在后台线程更新适配器。
private synchronized void updateAdapter() {
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@Override
public Void doInBackground(Void... params) {
adapter.notifyDataSetChanged();
return null;
}
};
task.execute();
}
在运行这行代码时,应用程序因错误而崩溃,
“只有创建视图层次结构的原始线程才能接触其视图。”
进一步搜索,建议解决方案是在ui线程上运行。
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
这让我回到了最初的问题。 我应该如何处理这个问题?任何帮助表示赞赏。 谢谢。
【问题讨论】:
-
您不能在
doInBackground中执行notifyDataSetChanged,您必须在onProgressUpdate或onPostExecute . causedoInBackground 中执行此操作,这只是在工作线程中触发的回调,并且您想做notifyDataSetChanged必须在 UI 线程中,因此您可以在onProgressUpdate中执行notifyDataSetChanged,它作为处理程序将您的按摩从工作线程转移到 UI 线程,或者在工作线程之后在您的 UI 线程中调用的`onPostExecute完成它的工作。 -
但这会挂起 ui。这是最初的问题。
-
这只是证明人们甚至没有阅读就将问题标记为重复,这对社区来说非常重要。
标签: android multithreading android-asynctask android-recyclerview notifydatasetchanged