0

我正在开发一个需要向/从服务器发送和接收 http 消息的 Android 项目(API 级别 10)。

我实现了一个名为 NetworkManager 的类,它提供了不同的方法,每个 http 请求一个方法(例如: loginRequest(user pass), RegistrationRequest(user.....) )。

所有这些方法都会生成一个 JSON 对象,该对象会传递给名为 sendMessage 的方法,该方法是实际建立连接、发送和接收响应的方法(也是一个 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 个请求,我应该创建 N 个扩展 AsyncTask 的类。

谢谢!

4

2 回答 2

2

我建议你使用INTERFACES来处理 http 请求的响应。

后台线程要么是 AysncTask 要么是 Thread 需要同时处理

  • 回复

  • 例外

这样想

MainThread - 嘿后台线程执行此操作,并在您完成时通知我。

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

希望这一切都能带来你想要的。这是一个很长的答案,我费了很大的力气才弄清楚。:)

于 2012-05-12T15:51:27.673 回答
0

为什么不直接使用 AsyncTask.THREAD_POOL_EXECUTOR(Runnable run);

它包装了一个基于线程池的 #cores + 1 并行度级别的执行器。

然后你可以简单地调用:

AsyncTask.THREAD_POOL_EXECUTOR(new Runnable(){
    public void run(){
       doLogin();
});
于 2016-05-29T22:03:37.760 回答