2012-05-12 3 views
0

私は、サーバーとの間でhttpメッセージを送受信する必要があるAndroidプロジェクト(APIレベル10)に取り組んでいます。Androidの汎用ネットワークマネージャー

NetworkManagerという名前のクラスが実装されています。このメソッドは、httpリクエストごとに1つずつ(LoginRequest(user pass)、RegistrationRequest(user .....))異なるメソッドを提供します。

これらのメソッドはすべて、実際に接続を確立し、応答(jsonオブジェクト)を送受信するメソッドであるsendMessageというメソッドに渡されるJSONオブジェクトを生成します。

もちろん、ネットワークコールには時間がかかるので、ネットワーク操作の実行中にAsyncTaskを使用してprogressDialogを表示することにしました。

問題は、メインスレッドが実行した結果を含む他の操作を実行する前に、バックグラウンドスレッドから応答値を取得する必要があることです。 同時に、私はAsyncTaskの共通の再利用可能な実装を作りたいと思います。

例:2つのEditText(ユーザー名、パスワード)と[ログイン]ボタンを示すログインアクティビティがあります。ログインボタンを押すと、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

httpリクエストの応答を処理するのにインターフェイスを使用することをお勧めします。

バックグラウンドスレッド、それはAysncTaskであるか、またはそれはスレッドもどちらかが

両方

  • 応答

  • 例外がこのよう

    ようにそれを考えて処理する必要がありますMainThread - Hあなたが完了したら、この操作を行い、私に知らせてください。

    MainThread - バックグラウンドスレッドがその操作を実行するまで、進捗ダイアログを表示させます。

    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(); 
}); 
関連する問題