Android отображает белый экран до запуска Asynctask, но я уже загрузил макет

Итак, у меня есть следующий код и проблема: он должен загрузить макет с надписью "загрузка базы данных" (динамически добавляемый в макет), однако я получаю белый экран до тех пор, пока база данных не обновится, а затем она просто продолжает add_categories_layout(0) и работает нормально.

Как мне заставить его показать мне первый макет?

protected void onResume () {

    super.onResume();
    setContentView(R.layout.home_screen_layout);
    SF = (LinearLayout) findViewById(R.id.SF);
    p_db_adapter = new DBAdapterProducts(getApplicationContext());
    c_db_adapter = new DBAdapterCategories(getApplicationContext());
    add_downloading_DB_layout();

    new UpdateDB().execute(CATEGORY_URL, PRODUCTS_URL, TIMESTAMP_URL_CATEGORIES, TIMESTAMP_URL_PRODUCTS);       
    while(DBupdated == false){}
    add_categories_layout(0);

}

4 ответа

Решение

Он не будет рисовать экран до тех пор, пока не завершится onResume, а onResume не завершит работу, пока DBUpdated не станет true (в этот момент макеты меняются местами).

Обычно вы устанавливаете представление содержимого в oncreate() метод. Там может быть код, вызывающий это, не работа. Если у вас нет метода Oncreate, создайте его и скопируйте / вставьте этот код туда.

Вы должны положить setContentView в любом onCreate() или же onCreateView()

Также мы можем увидеть динамическое добавление макета?

Вы можете положить add_categories_layout(0); в onPostExecute() вашей AsyncTask так как он работает на UI Thread, Поэтому, когда ваша задача завершится, он запустит этот метод и onResume() может закончить делать то, что ему нужно. Если твой AsyncTask это внутренний класс, то у вас будет доступ к Activity методы и переменные-члены. Если это отдельный файл, то вам просто нужно передать ссылку на ваш Activity чтобы вызвать метод.

Вот пара ответов, которые могут помочь с этим, если вам нужно.

Как уже говорили другие, как правило, setContentView() сделано в onCreate() чтобы убедиться, что это одна из первых вещей, которая работает, но это не должно быть проблемой. Тем не менее, я бы перенес его туда, если у вас нет причин иметь это в onResume(),

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