我无法更新我的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() {
}
});
这让我回到了我最初的问题。 我该如何处理这个问题?任何帮助表示赞赏。 谢谢。
答案 0 :(得分:1)
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();
}
请研究Asynctask doInBackground
不应该有任何UI更改。在这种情况下,您正在asynctask中的单独线程上执行UI更改。将notifydatasetchange放在onPostExecute上,如下所示(适用于主线程)。要在主用户界面上添加onPreExcute()
和onPostExecute()
,在单独的线程(不是主用户界面)上执行onBackground()
。
private synchronized void updateAdapter() {
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@Override
public Void doInBackground(Void... params) {
// query your db or perform long operations here
return null;
}
@Override
onPostExecute(Void.. params){
adapter.notifyDataSetChanged();
}
};
task.execute();
}