Android Splash Screen не отображает контент, когда активна нить таймера - PullRequest
0 голосов
/ 26 августа 2011

У меня есть заставка и я использую нить таймера, чтобы отобразить его в течение 2,5 секунд, это работает нормально, но я получаю пустую страницу.Если я удаляю нить таймера, моя страница отображается отлично.

  Thread splashTimer = new Thread(){
        public void run(){
            try{
                int splashTimer = 0;
                while (splashTimer < 2500){
                    sleep(200);
                    splashTimer = splashTimer + 200;
                    Intent navMainPage = new Intent("com.extempor.cheetah.CLEARSCREEN");
                    startActivity(navMainPage);

                }
            }
            catch(InterruptedException e){
                e.printStackTrace();
            }
            finally{
                finish();
            }


    }


};
splashTimer.run();

Страница, когда она отображается правильно, показывает изображение в формате png.Я пробовал только текстовое представление, но ничего не работает, пока у меня есть нить таймера.Я использую 2.3.3 и Eclipse 3.7

Кажется, что поток таймера является стандартным способом отображения заставки, но почему при его использовании не отображается содержимое?

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Никогда не делайте ничего, связанного с пользовательским интерфейсом, в потоке, не являющемся пользовательским интерфейсом, например, в качестве таймераИспользуйте AsyncTask, если вам нужно показывать заставку при выполнении некоторых других заданий.

AsyncTask имеет 3 основных метода:

OnPreExecute (), выполняется внутри потока пользовательского интерфейса и запускается перед выполнением асинхронного потока,Здесь вы можете делать все что угодно, например показывать заставку.

DoInBackground () это выполняется в своем собственном потоке, вне потока пользовательского интерфейса.Здесь вы не можете обновить пользовательский интерфейс, это главным образом для выполнения любой задачи по настройке, необходимой вашему приложению, в то время как пользователь читает ваш экран-заставку.

OnPostExecute () запускается, когда DoInBackground () выполняется и работает в потоке пользовательского интерфейсаВы можете отключить заставку здесь.

Снимите показание здесь

1 голос
/ 26 августа 2011

Прежде всего, вы абсолютно не должны заставлять своих пользователей ждать любое количество времени, которое не является абсолютно необходимым.Если вам нужно выполнить какую-то трудоемкую работу при запуске, покажите во время этого заставку и используйте обратный вызов обработчика, чтобы скрыть его, когда работа будет завершена.Заставлять ваших пользователей ждать 2 или 3 секунды без всякой причины, просто чтобы вы могли показать им, что красивая картинка глупа и не позволит людям использовать ваше приложение IMO.

Я достиг этого эффекта с помощью анимации fadeOut.

см. Этот вопрос для примера кода анимации.Если вы используете код из этого примера, вы можете использовать что-то вроде этого, чтобы задержать его на 2 секунды

    Runnable r = new Runnable(){
        public void run(){
            introLayout.startAnimation(fadeOutAnim);
            introLayout.setVisibility(View.GONE);

        }
    };
    Handler h = new Handler();
    h.postDelayed(r, 2000);

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

0 голосов
/ 26 августа 2011

Я предлагаю Тим ответ.Тем не менее, предположим, что вы дошли до последней строки в своем фрагменте кода.

, т.е. когда вы вызывали "SplashTimer.run ()"!

Существует разница между запускомпоток, используя run () и start (), что вам нужно понять.

Чтобы быть кратким и простым, run (): запускает поток синхронно.start (): запускает поток асинхронно.

Для дополнительных обсуждений вы можете изучить эту ссылку

...