0

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

httpリクエストごとに1つずつ異なるメソッドを提供する NetworkManager という名前のクラスを実装しました(例: loginRequest(user pass)、RegistrationRequest(user.....) )。

これらのメソッドはすべて、sendMessage というメソッドに渡される JSON オブジェクトを生成します。このメソッドは、実際に接続を確立し、応答を送受信します (これも 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 個のクラスを作成する必要があるためです。

ありがとうございました!

4

2 に答える 2

2

私がお勧めするのは、HTTP リクエストの応答を処理するためにINTERFACESを使用することです。

バックグラウンド スレッドは、AysncTask または Thread のいずれかであり、両方を処理する必要があります

  • 応答

  • 例外

このように考えてください

MainThread - バックグラウンド スレッドがこの操作を実行し、完了したらお知らせください。

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();  

このすべてがあなたが望むものにつながることを願っています. それは長い答えであり、理解するのにかなりの努力が必要でした。:)

于 2012-05-12T15:51:27.673 に答える