在noifydatasetchanged上的recyclerView.adapter挂起了ui android

时间:2017-03-28 13:10:55

标签: android multithreading android-asynctask android-recyclerview notifydatasetchanged

我无法更新我的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() {

}
});

这让我回到了我最初的问题。 我该如何处理这个问题?任何帮助表示赞赏。 谢谢。

1 个答案:

答案 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();
}