2015-01-06 36 views
0

我有一個運行每次用戶啓動應用程序,以驗證用戶接入功能。在每次啓動時,用戶標識將被髮送到服務器以進行身份​​驗證,當它們通過身份驗證時,用戶可以使用該應用程序。使應用程序等待,直到HTTP響應收到

的問題我不能讓在主線程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

'帶有'ProgressDialog'的AsyncTask'將創建魔術..! – user370305

+0

使用ProgressBar是推薦的方法來指示進度,然後在請求完成時將其隱藏。此外,這可能有點超過頂部,但考慮使用Robospice或專業圖書館做網絡請求,以節省您一些麻煩,稍後在https://github.com/stephanenicolas/robospice/wiki –

回答

0

您不想持有UI線程。用戶會認爲該應用程序崩潰,他們可能會得到一個應用程序沒有響應。

您可以使用Splash活動來檢查您的身份驗證,例如AsyncTask例如和一個不確定的ProgressBar,如果成功,則導航到應用程序,否則請轉到登錄或註冊。

或者你可以讓你的佈局不可見的使用android:visibility="gone",並作出進度可見,直到認證是然後使用setVisibility(View.VISIBLE);你查看對象和ProgressDialog,以無形再次打開你主視圖中可見。

0

如果標準listadapter是你的主要活動/片段,你可以做到以下幾點:

的道理,只安裝適配器(emptydatalist)AUTH之前,並顯示在與空消息的UI列表( 「檢查用戶身份驗證」)。如果你使用wifi,它可能會很快,以至於他們看不到任何初始UI。

如果你已經有可能是有效的,可以使用它在dataCall以獲取列表的適配器,然後進行數據呼叫,你可能會得到列表或者可能得到錯誤(沒有AUTH)

如果令牌你得到的數據,然後更新適配器的數據列表,並調用適配器上的「notify()」,你就完成了......

如果你沒有獲取數據,或者你不想進行數據的初始調用然後使用陳舊的令牌....

打電話來驗證使用...

使用從上述的響應

刷新數據的數據呼叫..(有效令牌)在適配器

呼叫適配器上通知。

注意所有數據呼叫發生在後臺線程。通過主UI線程上發生的Notify UI回調。

注意你不需要你自己的線程遵循這個還挺模式,因爲該框架還內置了API的東西這個用例。如上面所提到,你可以使用的AsyncTask,也可以使用與隊列HTTP可運行及事件驅動的回調消息尺蠖(HTTP的響應,處理程序讀取響應數據和消息發送回主UI)