Android, жизненный цикл активности делает p.roblem для получения результата из диалога - PullRequest
0 голосов
/ 21 декабря 2011

В моем приложении я использую onCreate () для инициализации приложения, onStart () и onResume ().

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

Затем, после получения токена, я должен перейти к следующему шагу, которыйЗначение onResume ().

, но проблема в том, что после отображения диалога из onStart () действие переходит к следующему циклу onResumme ().Как я могу сказать android: «Эй, парень, пожалуйста, не переходите к следующему циклу, пока я не получу токен с сервера»?

Это мой код:

@Override
    protected void onStart() {
        super.onStart();
        Log.i("MA_onStart", "Activity is abut to start...");

    .
    .
    .

        if(!isOnline())
        dialogWarning.show();


        if(!isTokenValid())
            dialog.show();
    }
}

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

if (! IsTokenValid ()) dialog.show ();

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

Спасибо

==========> Обновление

Я изменил код на этот

gotoNextCycle = true;
            while(gotoNextCycle)
            if(!isTokenValid())
                dialog.show();

и поставьте gotoNextCycle = false;, когда пользователь нажимает кнопку «Да» в диалоговом окне.Как я и ожидал, приложение упало.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2011

Диалоги Android являются асинхронными.

Итак, вы должны сделать следующее:

  1. Создать AsyncTask,
  2. в диалоге показа onPreExecute
  3. в doInBackground сделать всю процессию сети
  4. в onPostExecute закрывает ваш диалог, обновляет экран с полученными данными.
0 голосов
/ 21 декабря 2011

В чем проблема, если вы позволите Android продолжить цикл ..
Я имею в виду, что произойдет, если будет вызван onResume()?

Вы не должны ждать в onStart() или onResume() ответов от сервера.
Это приведет к ANR, как вы заметили.
Вы можете обновить свое приложение, чтобы после получения ответа от сервера с действительным токеном вы могли обновить свое представление или данные, показанные в упражнении.
Возможно, дайте нам знать, какую информацию вы показываете в Деятельности, мы можем попытаться помочь вам справиться с неправильным случаем токена (получить токен с сервера и обновить информацию).

EDIT

Вы можете ссылаться на следующий код:

@Override
protected void onResume() {
    super.onResume();

    if(isTokenValid()) {
       doProcess();
    } else {
       showDialog(USER_ID_DLG);
    }
  }

private void doProcess() {
   .... 
}

в onClick() диалогового окна (кнопка «Да») запускает Tread или AsyncTask для получения токена с сервера. Тем временем вы можете отобразить диалоговое окно хода выполнения ( "Идет загрузка ... подождите" видов). Получив ответ от сервера, в Thread или AsyncTask закройте это диалоговое окно прогресса и затем наберите doProcess().

Я предполагаю, что вы показываете некоторую информацию в этом упражнении пользователю, основываясь на ответе сервера / токене. Поэтому, как только диалоговое окно Progress закрывается, ваш doProcess() может обновлять представления.

Если аутентификация не удалась, вы можете позвонить finish() в Activity после того, как покажете пользователю Toast о сбое.

Также убедитесь, что вы вызываете setCancelable(false) в диалоговом окне Progress.

...