2012-05-12 66 views
0

我正在開發需要向/從服務器發送和接收http消息的Android項目(API級別10)。Android中的通用網絡管理器

我實現了一個名爲NetworkManager的類,它提供了不同的方法,一個用於每個http請求(例如:loginRequest(用戶傳遞),RegistrationRequest(用戶.....))。

所有這些方法生成傳遞給名爲sendMessage的方法的JSON對象,該方法實際上建立連接,發送和接收響應(也是json對象)。

當然,網絡調用非常耗時,所以我首先決定在網絡操作執行時使用AsyncTask來顯示progressDialog。

問題是,我需要在執行任何其他涉及結果本身由主線程完成的操作之前,從後臺線程獲取響應值。 同時,我想做一個AsyncTask的通用和可重用的實現。

例如:我有一個登錄活動,顯示2個EditText(用戶名,密碼)和一個名爲Login的按鈕。當我按登錄按鈕時,必須出現一個progressDialog,並且必須在完成doInBackground任務後處理。當然,我可以做到這一點的方法:

onClick(View v) //called when the login button is pressed 
{ 
    onPreExecute() 
    { 
     //Show the progress dialog 
    } 

    doInBackground() 
    { 
     //Retreive the login response (an integer containing a message code) using sendLoginRequest(username, password); 
     //return the response 
    } 

    onPostExecute(int response) 
    { 
     //Dispose the progress dialog, then loginSucessfull ? start new activity : show error toast 
    } 
} 

但是,這樣做的方式,我要實現對每一個請求,我需要要發送的異步任務我想如何避免,因爲如果我有N個請求,我應該創建擴展AsyncTask的N個類。

謝謝!

回答

2

我建議你使用INTERFACES來處理http請求的響應。

後臺線程要麼是AysncTask或者是線程需要同時處理

  • 響應

  • 例外

覺得它像這樣

MainThread - H ey背景線程執行此操作,並讓我知道你什麼時候完成。

MainThread - Ok直到後臺線程執行其操作讓我顯示進度對話框。

BackGroundThread - 我完成了我的工作。嘿MainThread在這裏捕捉你的反應或異常

MainThread - 讓我停止顯示進度條。

所以我們需要通過代碼模擬這種回調機制,並且還需要注意我們實現了可重用的體系結構。

像這樣的事情

定義一個接口

public interface HttpRequestResponse { 
    public void onSuccess(HttpResponse response); 
    public void onException(Exception exception); 
}  


class HttpRequestResponseHandler { 

    private ActionItem action; 
    private HttpRequestResponse hrr; 
    private Executor executor; 

    public enum ActionItem { 
     LOGIN_REQUEST , 
     REGISTRATION_REQUEST    
    } 

    public HttpRequestResponseHandler(ActionItem action, HttpRequestResponse hrr) { 
     this.action = action; 
     this.hrr = hrr;  
    } 

    public void execute(){ 
    executor = new Executor(); 
    executor.execute();  
    } 

    private class Executor extends AsyncTask<Void,Void,Void> { 

     @Override 
     public Void doInBackground() { 
     switch(action) { 

      case LOGIN_REQUEST : doLogin(); 
           break; 

      case REGISTRATION_REQUEST : doRegistration(); 
             break; 
     } 
     } 
    } 

    private void doLogin() { 

     HttpResponse response = null; 
     Exception exception = null; 
     try { 
     response = makeHttpRequestHere(); 
     } catch (Exception e) { 
     exception = e; 
     } 

     if(exception != null) { 
     hrr.onException(exception); 
     } else { 
     hrr.onSuccess(response); 
     } 

    } 

} 

現在在某處你的活動代碼文件做這樣的。

HttpRequestResponse hrr = new HttpRequestResponse(){ 

    @Override 
    public void onSuccess(HttpResponse response) { 
     hideProgressDialog(); 
     handleResponse(response); 
    } 

    @Override 
    public void onException(Exception exception) { 
     hideProgressDialog(); 
     showErrorDialog(exception.getMessage()); 
    } 
} 

HttpRequestResponseHandler hrrh = new HttpRequestResponseHandler(ActionItem.LOGIN_REQUEST,hrr); 
hrrh.execute(); 
showProgressDialog(); 

希望所有這一切都能達到你想要的。 它是一個很長的答案,並花了我很多努力的數字。 :)

+0

感謝您的答覆,很清楚!只需稍作修改,我就可以將您的代碼重用到我的項目中;-) – MastErAldo

+0

如果通過單擊答案左側的綠色右側符號有助於接受答案。這樣你就可以欣賞答案,並幫助其他領導者走向正確的方向。這種社區的工作方式。 :) – Javanator

0

爲什麼不只是使用AsyncTask.THREAD_POOL_EXECUTOR(Runnable run);

它包裝基於線程池的#cores + 1並行級別執行程序。

然後,你可以簡單地調用:

AsyncTask.THREAD_POOL_EXECUTOR(new Runnable(){ 
    public void run(){ 
     doLogin(); 
});