2017-06-21 89 views
-5

我有一個android應用程序中的登錄視圖,我想同步運行。也就是說,我希望用戶留在頁面上,直到登錄休息呼叫完成。如果失敗,用戶可以重新輸入他們的ID和密碼。如果成功,它們將被路由到歡迎頁面。如何在Android上使用Retrofit進行同步呼叫

改造提供瞭如何進行同步調用的示例。但它帶有一個警告:「同步請求觸發Android 4.0或更新版本的應用崩潰,您將遇到NetworkOnMainThreadException錯誤。」我已經看到了stackoverflow上的各種反應,包括使用Otto和Robospice。其他人可以使用本地收聽者和其他人使用同步請求。

什麼是最簡單,最安全的方式來實現此功能。

回答

-3

您不需要同步請求來實現此目的。

在主線程上執行同步請求。在android中,主線程用於繪製UI,因此在該線程上執行網絡請求會阻止您的UI,因此Android會引發異常。

異步請求在單獨的線程中執行聯網並且具有回調將信息傳遞迴主線程。這是你需要的。

下面是使用改裝的示例代碼是什麼樣子,你的情況

call.enqueue(new Callback<LoginResponse>() { 
    @Override 
    public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { 
     if (response.isSuccessful()) { 
      // status code 2xx. start welcome activity 
     } else { 
      // Recieved a response but not 2xx. 
      // Possibly authentication error. Show error message 

     } 
    } 

    @Override 
    public void onFailure(Call<LoginResponse> call, Throwable t) { 
     // request could not be executed (possibly no internet connection) 

    } 
} 
+0

這是目前我在做什麼。問題是如何將結果返回給我的調用片段。我可以傳遞片段的一個實例,但看起來可能不是最好的事情,因爲片段可能會消失。或者我可以使用Otto或Robospice之類的東西,但看起來像是過度殺傷。另外,我希望登錄屏幕上有一些表示身份驗證正在進行,因此他們不會離開。 – user6627139

+0

這就是'onResponse'的用途。它爲您的呼叫活動/片段提供響應。你可以在'enqueue'調用之前顯示一個不確定的'ProgressBar'並將它隱藏在'onResponse'塊 – akash93

+0

是的,我明白了。正如我所說,這就是我目前正在做的。我想把我的登錄休息請求放在一個單獨的類中(用於測試,重用等),所有邏輯都與發送和獲取響應相關聯,而不是在片段或活動中。然後讓片段在我的休息服務類上調用一個方法,並在完成時收到通知。 – user6627139