Обновление RecyclerView - PullRequest
       8

Обновление RecyclerView

0 голосов
/ 03 ноября 2018

У меня есть представление переработчика, которое я хочу обновить. Ему нравятся сообщения в Instagram, которые получают данные постов с сервера, добавляют их в список массивов и обновляют адаптер с помощью функции 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 (), но этот метод сначала получает все данные, а затем создает View, и из-за этого приложение слишком долго запускается. Что я могу сделать?

1 Ответ

0 голосов
/ 03 ноября 2018

Ваш подход не самый лучший, может иметь много проблем, но вы можете использовать

runOnUiThread(new Runnable() {
     void run() {
           adapter.notifyDataSetChanged();
     }
});

Другим решением было бы сделать класс Расширить его из AsyncTask, переопределить doInBackground и метод post execute. Извлекать данные из doInBackground () и обновлять пользовательский интерфейс onPostExecute ()

Руководство: https://developer.android.com/reference/android/os/AsyncTask

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...