2015-10-16 3 views
0

Первое действие моего приложения - проверка базы данных и ее обновление при необходимости.Android setContentView и вычисления

@Override 
public void onCreate(Bundle savedInstanceState) { 
    setTheme(getThemeFromPreferences(this)); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_first); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    //Test et remplissage de la BDD 
    ProgressBar progressBar = (ProgressBar) findViewById(R.id.firstProgressBar); 
    DatabaseFeeder.testAndFeed(this, progressBar); 
    //Launch welcoming activity 
    Intent i = new Intent(this, AccueilActivity.class); 
    startActivity(i); 
} 

Статический метод DatabaseFeeder.testAndFeed немного медленно, потому что он читает из активов, так что это может занять как 5 секунд, чтобы заполнить базу данных.

Проблема в том, что ContentView не установлен до фидера! Моя активность пуста в течение 5 секунд, а затем появляется как просмотр содержимого, включая полностью заполненный индикатор прогресса.

Почему это так?

+0

Попытайтесь получить доступ к промежуточному бару внутри себя, а не в onResume. Просто отпустите его внутри. –

+0

Уже пробовал и не работает, также попробовал onStart(). Нет увольнения, это не прогрессDialog. –

ответ

1

запустить следующий код в задаче асинхронном:

это будет работать с приложениями основной поток бесплатно для предоставления необходимых представлений. также всегда полезно отделить длительные операции от основного потока приложений.

+0

Я думал, что это может быть вопрос с нитью. Не могли бы вы объяснить причины? И случайно, нет ли способа сказать «визуализировать взгляд, а затем делать другие вещи»? –

+0

это потому, что вы блокируете основной поток приложений. Функция 'setcontentView()' немедленно возвращается, поскольку система будет раздувать представление в отдельном потоке. этот поток не может отправить результат в основной поток, поскольку он заблокирован вашей длительной операцией БД. если вы выполняете операцию БД в отдельном потоке, используя основной поток AsyncTask, вы сможете свободно выполнять другие важные задачи. –

+0

OK, отличное объяснение! Но как я могу заставить свой DatabaseFeeder вызвать publishProgress для Asyntktask? –

1

Это довольно просто, вызовите одну асинтексу внутри вашего onCreate() menthod для вашей операции с базой данных и внутри onPostExecute(), обновите свой интерфейс и отпустите диалог прогресса.

Причина в том, что вы выполняете updets UI в вашем MainThread, когда все ваши все операции будут сделаны, вы пытаетесь обновить UI. Операции с базой данных должны выполняться внутри фона или отдельного потока, поэтому при выполнении операции он не может воздействовать на основной поток пользовательского интерфейса.

 Смежные вопросы

  • Нет связанных вопросов^_^