2014-10-17 56 views
0

我有一個函數向使用httpPost的REST API執行請求。因此,使用一些的NameValuePair和UrlEncodedFormEntity魔法設置了一切之後,我有這樣的代碼:許多涉及網絡操作的函數

try { 
     httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair)); 
     // parsing the response here 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 

這個原本投入的函數(公共字符串),它採用了REST API的響應返回訪問令牌。該函數存在於僅用於與API通信的類中。從我的主要活動中,我創建此類的一個實例,然後調用:

String accesstoken = ApiHandler.login(); 

從MainActivity。此訪問令牌需要在應用程序中執行其他操作,因此必須在應用程序可以繼續之前完成。我將應用程序的上下文傳遞給ApiHandler,以便能夠從ApiHandler類中顯示Toast消息和AlertDialogs。但是,我現在有幾個問題:

如何保持屏幕上從ApiHandler的登錄函數調用的progressdialog,直到我有accesstoken?我嘗試使用線程,但線程,整個登錄函數和調用登錄函數的主UI活動之間的通信似乎需要大量工作。此外,更重要的是,它需要我使用thread.join(),因爲如果應用程序沒有login()給出的訪問令牌,它就無法執行任何操作。 Logcat告訴我,這似乎凍結了用戶界面,因爲我得到一條消息說它跳過了30到50幀,並且可能會阻塞UI線程。

另一個問題是ApiHandler有很多功能,因爲API有很多不同的調用,所以像AsyncTask這樣的東西會使代碼不可讀,因爲它會導致大量的Asynctasks,並且每個函數都會返回不同類型的數據。爲ApiHandler中的每個函數編寫整個Asynctask以及它自己的doInBackground,onPostExecute和onPreExecute會使事情變得比他們應該看起來要困難得多。

那麼從非活動類運行代碼最簡單的方法是什麼?它需要在不凍結UI線程的情況下進行網絡連接,並且響應應該實際上是同步的,因爲應用中的很多操作都可以「當我有150個函數用於不同的API調用時,每個都有自己的函數,所以不會混亂代碼。

回答

0

使用一些android lib進行異步HTTP操作。 Retrofit from sqaure真棒。

從改造文檔

它使用註釋來描述HTTP請求:

  • URL參數替換和查詢參數支持
  • 對象轉換請求體(例如,JSON,協議緩衝區)
  • 多部分請求主體和文件上傳

示例代碼

public interface GitHubService { 
    @GET("https://stackoverflow.com/users/{user}/repos") 
    List<Repo> listRepos(@Path("user") String user); 
} 


RestAdapter restAdapter = new RestAdapter.Builder() 
    .setEndpoint("https://api.github.com") 
    .build(); 

GitHubService service = restAdapter.create(GitHubService.class); 


List<Repo> repos = service.listRepos("octocat"); 
+0

我花了一些時間來了解如何改造的作品,但我終於得到它了並且正在運行,而且它做的非常漂亮,確實使代碼非常乾淨!謝謝! – aDev 2014-10-18 11:32:58