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()
,