2012-06-14 2 views
1

У меня есть следующая сценария: в действии A, когда пользователь нажимает кнопку, приложение отправляет запрос на сервер для получения некоторой информации, тогда эта информация помещается в намерение начать активность B.Полная компоновка перед отображением окна активности

В действии B, в onCreate методе, я делаю setContentView(R.layout.activity_b) (этот макет довольно сложный, поэтому даже раздувание его из XML занимает некоторое время), затем выполните кучу инициализации. Наконец, в onStart я делаю некоторые окончательные приготовления/расположения компонентов.

В действии A, когда пользователь нажимает кнопку, я запускаю AsyncTask, который получает информацию с сервера и запускает активность B, передавая необходимую информацию в намерение. Когда я называю «startActivity», окно активности B сразу переходит в позицию, однако для завершения инициализации может потребоваться несколько секунд. В течение этих секунд я вижу черный экран. Затем, наконец, выполняется onStart и все продолжается.

Что бы я хотел сделать, так это завершить всю эту инициализацию за пределами экрана, до активность B скользит в поле зрения, так что, когда она «прибывает», все макеты уже присутствуют. Любые идеи, как достичь этого?

+0

Привет @Aleks G в AsyncTask выполняйте свою работу в doinbackground, что означает, что загрузка выполняется с сервера. то у вас есть опция onpostexecute в AsyncTask, в этом методе используется перенаправление. если вы сделаете это, вы не получите черный экран. а также в Activity B используют Async-задачу без загрузчика для привязки не-ui-данных. – itsrajesh4uguys

+0

@ Раджеш: это именно то, что я делаю - пожалуйста, внимательно перечитайте мой вопрос. Проблема заключается в методе 'onCreate' в действии B. В эмуляторе требуется около 5 секунд - просто для раздувания макета, настройки локальной ссылки и первичной инициализации. Только для раздувания занимает около 3 секунд. Все эти 5 секунд я смотрю на черный экран. –

+0

@ Aleks вы загружаете данные в действии справа. то вы переходите к Activity B. Вместо этого вы можете использовать Async Task в Activity B. В oncreate просто запустите задачу async с прогрессом, как загрузка деталей ... затем в post execute u можно связать данные – itsrajesh4uguys

ответ

0

Я не думаю, что вы можете. Действия по своей природе только «живы», пока они показывают на экране.

Поэтому я думаю, что вы не можете сигнализировать Деянию, чтобы начать выполнять работу (т. Е. Создавать экземпляры), не находясь на переднем плане на экране.

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

+0

Хорошо, предположим, что активность на переднем плане, но я ненавижу представление черного экрана. Что-нибудь, что можно сделать по этому поводу? Прозрачность или что-то еще? Что-нибудь? Проблема в том, что инициализация занимает некоторое время, и я хочу, чтобы этот процесс был «удобным». –

+0

Сделайте себе полноэкранное изображение и поместите его как fill_parent/fill_parent в свой xml. Установите все, кроме изображения, чтобы оно было невидимым. Сразу после завершения setContentView() это изображение должно быть единственным на экране. После того, как вы закончите инициализацию всех ваших других представлений, все они станут видимыми и установите невидимое изображение. На самом деле это экземпляр, где «экран заставки» имеет смысл, потому что вы используете его только во время выполнения какой-либо работы, чтобы обеспечить лучший пользовательский опыт. – FoamyGuy

0

Возможно, фрагменты могут помочь? Измените действия A & B на фрагмент A & B и загрузите фрагмент B в фоновом режиме, не показывая его.

+0

Спасибо, но, к сожалению, этого не сделать, поскольку приложение должно поддерживать 2.1. –

+0

СовместимостьLibrary решит эту проблему: http://android-developers.blogspot.fr/2011/03/fragments-for-all.html –

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