Android: мигает изображение на экране, когда загружается другой просмотр содержимого

1

Я прочитал несколько сообщений по этой теме. Вот моя стратегия; У меня есть приложение для рисования, которое показывает созданные пользователем рисунки в ListView. Когда пользователь выбирает чертеж, активируется действие DrawingEdit, а загружаемый чертеж в onCreate примерно следующим образом:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // set the layout for the activity
setContentView(R.layout.drawing_view);

    // do potentially expensive loading of drawing here
    loadDrawing();
}

Где loadDrawing() загружает отдельные формы пользовательского чертежа из базы данных. Теперь, для 95% чертежей и для "типичного" варианта использования это прекрасно работает, так как активность загружается быстро, без задержки. Однако для очень сложных рисунков задержка может достигать двух секунд. Чтобы решить эту проблему, я попытался использовать AsyncTask, который отлично подходит для 5% чертежей, которые чрезмерно велики, но для других 95% кажется излишним, и на самом деле делает загрузку немного медленнее из-за того, что приходится стрелять вверх по AsyncTask. Это не худшее решение, но я смотрю на альтернативы.

Теперь, помимо данных чертежа, которые я сохранил в базе данных, у меня также есть статическая PNG-версия чертежа, которую я могу использовать... так что решение, которое я бы хотел использовать, строки:

  • Загрузите временный экран "всплеск" в начале onCreate(), используя статический чертеж в качестве заполнителя, который пользователь может сразу просмотреть во время загрузки чертежа.
  • Запустите иногда дорогостоящую процедуру loadDrawing().
  • После завершения перейдите в представление и покажите вторичный вид с полностью интерактивным рисунком, который включает в себя фигуры из loadDrawing().

Моя проблема в том, что если я смоделирую вышеприведенное решение примерно так, как показано ниже, макет "всплеск" никогда не отображается, и до тех пор, пока loadDrawing() не будет завершена, будет сохраняться та же самая задержка, а затем отобразится окончательный макет. Любая информация о том, что здесь происходит? Должен ли я перемещать loadDrawing() в onResume так, чтобы начальный пользовательский интерфейс всплеска имел возможность загружать до срабатывания loadDrawing()?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // set the layout for the activity
setContentView(R.layout.splash_view);

    // do potentially expensive loading of drawing here
    if (loadDrawing()) {
      // set the layout for the activity
  setContentView(R.layout.drawing_view);
    }
}
Теги:
android-layout

1 ответ

0
Лучший ответ

Если loadDrawing - это метод внутри вашей Activity, он блокирует поток пользовательского интерфейса, пока он не будет завершен. Короче говоря, пользовательский интерфейс не отображается до тех пор, пока не будут завершены шаги запуска (create/start/resume). Не имеет значения, если вы установите loadDrawing в onResume, поскольку он все равно заблокирует создание пользовательского интерфейса.

Вам нужно использовать какой-то фоновый асинхронный поток, чтобы заставить это работать - вот почему AsyncTask полезен, чтобы позволить пользовательскому интерфейсу рисоваться/манипулировать, в то время как что-то еще должно произойти в одно и то же время.

  • 0
    Ах, хорошо, отлично, я не был уверен на 100%, очевидно, когда рисовался пользовательский интерфейс, это покрывает это, спасибо.
  • 0
    @Paul: Рад помочь, должен признать, это смутило меня, когда я впервые столкнулся с деятельностью и темой пользовательского интерфейса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню