Java Android中的通用网络管理器

Java Android中的通用网络管理器,java,android,multithreading,http,networking,Java,Android,Multithreading,Http,Networking,我正在从事一个Android项目(API级别10),它需要向服务器发送和接收http消息 我实现了一个名为NetworkManager的类,该类提供了不同的方法,每个http请求一个(例如:loginRequest(用户传递)、RegistrationRequest(用户…) 所有这些方法都会生成一个JSON对象,并将其传递给名为sendMessage的方法,该方法实际建立连接、发送和接收响应(也是一个JSON对象) 当然,网络调用非常耗时,所以我首先决定在执行网络操作时使用AsyncTask来

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

我实现了一个名为NetworkManager的类,该类提供了不同的方法,每个http请求一个(例如:loginRequest(用户传递)、RegistrationRequest(用户…)

所有这些方法都会生成一个JSON对象,并将其传递给名为sendMessage的方法,该方法实际建立连接、发送和接收响应(也是一个JSON对象)

当然,网络调用非常耗时,所以我首先决定在执行网络操作时使用AsyncTask来显示progressDialog

问题是,在执行任何其他操作之前,我需要获取从后台线程检索到的响应值,这些操作涉及到主线程执行的结果本身。 同时,我想为AsyncTask创建一个通用的、可重用的实现

例如:我有一个登录活动,显示2个编辑文本(用户名、密码)和一个名为“登录”的按钮。当我按下登录按钮时,一个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的类


谢谢大家!

我建议您使用接口来处理http请求的响应

后台线程要么是AYSNTASK,要么是be线程,都需要处理这两个问题

  • 回应

  • 例外情况

这样想吧

主线程-嘿后台线程做这个操作,并让我知道当你完成

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

   }   

}
希望所有这些都能带来你想要的。
这是一个很长的答案,我花了相当多的精力来思考:)

为什么不使用AsyncTask.THREAD\u POOL\u EXECUTOR(Runnable run)

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

然后您可以简单地调用:

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

谢谢你的回复,非常清楚!只需稍加修改,我就成功地将您的代码重用到我的项目中;-)如果有助于通过单击答案左侧的绿色右侧符号接受答案。这样你会欣赏答案,并帮助其他人朝着正确的方向前进。这个社区就是这样运作的
AsyncTask.THREAD_POOL_EXECUTOR(new Runnable(){
    public void run(){
       doLogin();
});