Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 回收视图更新_Android_Arrays_Updates_Android Recyclerview - Fatal编程技术网

Android 回收视图更新

Android 回收视图更新,android,arrays,updates,android-recyclerview,Android,Arrays,Updates,Android Recyclerview,我有一个要更新的recycler视图。它像Instagram Posts一样,从服务器获取post数据并将其添加到数组列表中,然后使用notifyDataSetChanged()函数更新适配器。但当它要更新时,会出现此错误 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

我有一个要更新的recycler视图。它像Instagram Posts一样,从服务器获取post数据并将其添加到数组列表中,然后使用notifyDataSetChanged()函数更新适配器。但当它要更新时,会出现此错误

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7905)
    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1276)
    at android.view.View.requestLayout(View.java:22139)
    at android.view.View.requestLayout(View.java:22139)
    at android.view.View.requestLayout(View.java:22139)
    at android.view.View.requestLayout(View.java:22139)
    at android.view.View.requestLayout(View.java:22139)
    at android.view.View.requestLayout(View.java:22139)
    at android.view.View.requestLayout(View.java:22139)
    at android.support.v7.widget.RecyclerView.requestLayout(RecyclerView.java:3970)
    at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:5060)
    at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:11540)
    at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:6762)
    at com.example.MainActivity$2.run(MainActivity.java:179)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:257)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:784)
这是我的密码

AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            while (true) {
                String name = getHtml.getUrlContent("URL" + something);
                something += 1;
                list.add(new Model(Model.IMAGE_TYPE, name));
                adapter.notifyDataSetChanged();
            }
        }
    });
我认为发生错误是因为AsyncTask,然后我将其更改为runOnUiThread()函数,但此方法首先获取所有数据,然后创建视图,并且由于该应用程序启动时间过长。
我能做什么?

你的方法不是最好的,可能有很多问题,但你可以使用

runOnUiThread(new Runnable() {
     void run() {
           adapter.notifyDataSetChanged();
     }
});
另一个解决方案是让一个类从AsyncTask扩展它,重写doInBackground和on post execute方法。 获取doInBackground()上的数据并更新ui onPostExecute()


指南:

使用runOnUiThread包装通知我发布的示例