Определение нового представления внутри Asynctask не определено - ANdroid

У меня есть Asynctask, который находится внутри задачи деятельности. Когда я пытаюсь создать новый вид внутри Asynctask, он выдает ошибку и говорит, что она не определена. Вот то, что мой код в основном.

    public class DashboardActivity extends Activity {

                class loadComments extends AsyncTask<String, String, String> {
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected void onProgressUpdate(String... values) {
                super.onProgressUpdate(values);

            }

            @Override
            protected String doInBackground(String... params) {

            LinearLayout commentBox = new LinearLayout(this);





                return null;
            }

            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);

            }
        }// end asynctask
    }//end activity

Ошибка возникает, когда я пытаюсь сделать linearLayout или любой тип представления. Я попытался убрать (это) утверждение и разместить код везде.

3 ответа

Решение

doInbackground работает в фоновом потоке. Таким образом, вы не можете получить доступ / обновить пользовательский интерфейс из фонового потока. Вы можете обновить пользовательский интерфейс в потоке пользовательского интерфейса.

Msgstr "Только исходный поток, создавший иерархию представлений, может касаться его представлений."

Вы увидите вышеупомянутое сообщение, если вы обновите пользовательский интерфейс из фонового потока.

onPreExecute а также onPostExecute вызываются в потоке пользовательского интерфейса. Вы можете вернуть результат в doInBackground и обновить пользовательский интерфейс в onPostExecute. Результатом вычисления doInbackground является параметр onPostExecute.

Так как у вас было это

    LinearLayout commentBox = new LinearLayout(this);

this не относится к контексту активности в вашем случае. Даже если вы используете контекст активности и инициализируете линейный макет, вам нужно добавить его в корневой макет.

http://developer.android.com/reference/android/os/AsyncTask.html

      public class DashboardActivity extends Activity {
      LinearLayout layout;
      @Override
      public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      layout = new LinearLayout(this);
      setContentView(layout); 
      new loadComments().execute(params);
      }
        class loadComments extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);

        }

        @Override
        protected String doInBackground(String... params) {
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

        }
      }

Не следует выполнять какие-либо операции пользовательского интерфейса в doInbackground AsyncTask, которое вне потока пользовательского интерфейса, doInBackground вызывает фоновый поток.

Вместо этого вы можете выполнить операцию пользовательского интерфейса в onProgressUpdate, onPostExecute и onPreExecute

Для получения дополнительной информации см. http://developer.android.com/reference/android/os/AsyncTask.html

Тебе этого не сделать.

LinearLayout commentBox = new LinearLayout(this);

Сделайте это в потоке пользовательского интерфейса, то есть переместите его за пределы doInBackground().

Другие вопросы по тегам