Это плохая практика использовать нить.сон (миллисекунды) для ожидания немного, прежде чем начать другую деятельность?


Я делаю SplashScreen для приложения ... Когда приложение запускается ,оно начинает LoadingActivity... спите в течение 3 секунд, завершите (); а затем начните основную активность. Splash служит для обновления базы данных. Если база данных уже обновлена, я хочу, чтобы всплеск оставался в течение 3 секунд в любом случае.

Я использую следующий код:

protected void onPostExecute(Void result) {
    super.onPostExecute(result);
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        Intent intent = new Intent(LoadingActivity.this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}

Разве это плохая прическа? и почему? Приложение работает отлично в AVD.

3 3

3 ответа:

Спать в потоке пользовательского интерфейса-этоВсегда плохая идея. В этом случае вы находитесь в onPostExecute, который находится в потоке пользовательского интерфейса.

Бросьте свой сон в метод doInBackground вашего AsyncTask вместо этого, и вы не получите никаких ANR там (Android не отвечает).

Пользователи не любят ждать заставок, поэтому лучше не ждать вообще. Но иногда заставка требуется (т. е. из-за контрактов).

Да, это плохая практика, onPostExecute() вызывается в потоке пользовательского интерфейса, поэтому в основном вы блокируете поток пользовательского интерфейса на целых 3 секунды. Я подозреваю, что вы хотите показать заставку. Вместо этого вы можете сделать это вот так.

new Handler().postDelayed(new Runnable(){
    @Override
    public void run(){
        Intent intent = new Intent(LoadingActivity.this, MainActivity.class);
        startActivity(intent);
        finish();
     }
},3000);

Или , если вы хотите придерживаться AsyncTask, то переопределите doInBackground() и спите в нем и запустите свой Activity в onPostExecute() нормально.

Если это находится в самом начале программы, Вы можете сделать цикл while, который выполняется до системы.currentTimeMillis() больше, чем 3000, чем было в начале программы.