2015-01-06 5 views
0

У меня есть функция, которая выполняется для аутентификации доступа пользователя при каждом запуске приложения. При каждом запуске идентификатор пользователя & отправляется на сервер для аутентификации, а при их аутентификации пользователь может использовать приложение.Заставить приложение ждать ответа http-ответа

Проблема I can not делает HTTP-вызовы по основному потоку. И над отдельной нитью я не могу остановиться, чтобы дождаться ответа.

Как я могу заставить приложение дождаться ответа на аутентификацию?

if (usrObj.authenticateUser()) { 
         Intent controllerActivity = new Intent("android.intent.action.Main"); 
         startActivity(controllerActivity); 
        } else { 
         … 
        } 
//User.java 
public boolean authenticateUser() { 
     Thread thr_authenticateUser = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       //Make HTTP authentication request and wait for the reply. 
      } 
     }); 
     thr_authenticateUser.start(); 
     return authenticationStatus; 
    } 
+1

' AsyncTask' с 'ProgressDialog' создаст Magic ..! – user370305

+0

с использованием ProgressBar - рекомендуемый подход для указания прогресса, а затем скрытие его при завершении запроса.Также это может немного превысить верхний уровень, но подумайте о том, чтобы использовать Robospice или специализированную библиотеку для выполнения сетевых запросов, чтобы впоследствии сэкономить вам неприятности на https://github.com/stephanenicolas/robospice/wiki –

ответ

0

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

У вас может быть активность Splash, чтобы проверить вашу аутентификацию с помощью AsyncTask, например, и неопределенного ProgressBar, и, если это удастся, перейдите в приложение еще, войдите в систему или зарегистрируйтесь.

Или вы можете сделать ваш макет невидимым с помощью android:visibility="gone" и сделать видимость ProgressBar до тех пор, пока не произойдет аутентификация, а затем снова переключите ваш основной вид на видимый, используя setVisibility(View.VISIBLE); на вас. Объект View и ProgressDialog - невидимый.

0

Если стандартная listadapter ваша основная деятельность/фрагмент, вы можете сделать следующее:

до того AUTH на маркере, только настройки адаптера (emptydatalist) и показать список на интерфейсе с пустым сообщением («проверка авторизации пользователя»). Если вы на Wi-Fi, все может быть так быстро, что они не будут видеть начальный пользовательский интерфейс.

Если у вас уже есть маркер, который может быть действительным и может использовать его на dataCall, чтобы получить список для адаптера, а затем сделать данные звоните, вы можете получить список или не может получить ошибки (не AUTH)

Если вы получаете данные, затем обновляете список данных адаптера и вызываете «notify()» на адаптере, и все готово ....

Если вы не получаете данные или не хотите, чтобы этот первоначальный вызов для данных используя устаревший токен, то ....

сделать звонок для подтверждения использования ...

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

обновления в адаптере

вызова уведомление на адаптере.

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

Обратите внимание, что вам не нужны ваши собственные потоки, чтобы следовать этому образцу, потому что в каркасе есть встроенный материал api для этого прецедента. В качестве упоминания вы можете использовать asyncTask, или вы можете использовать петлитель сообщений с очередями для HTTP-runnables и вызванных событиями обратных вызовов (по http-response, Handlers для считывания данных ответа и возврата к основному пользовательскому интерфейсу)

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