Android AndBase框架使用封装好的函数完成Http请求(三)

2019-12-10 18:34:49刘景俊

  我们可以看到,这段函数首先通过Handler发送Message...同时开启一个线程池,来提交当前的请求,最后将执行doGet()方法,同时Handler一直对responseListener的消息进行处理..doGet()方法的源码过程如下

private void doGet(String url,AbRequestParams params,AbHttpResponseListener responseListener){
   try {
    
    responseListener.sendStartMessage();
    
    if(!debug && !AbAppUtil.isNetworkAvailable(mContext)){
     responseListener.sendFailureMessage(AbConstant.CONNECT_FAILURE_CODE,AbConstant.CONNECTEXCEPTION, new AbAppException(AbConstant.CONNECTEXCEPTION));
     return;
    }
    
    //HttpGet连接对象 
    if(params!=null){
     url += params.getParamString(); //如果有参,那么获取相关参数...
    }
    HttpGet httpRequest = new HttpGet(url); //定义连接对象..
    
    BasicHttpParams httpParams = new BasicHttpParams();
    
    // 从连接池中取连接的超时时间,设置为1秒
    ConnManagerParams.setTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
    ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRouteBean(DEFAULT_MAX_CONNECTIONS));
    ConnManagerParams.setMaxTotalConnections(httpParams, DEFAULT_MAX_CONNECTIONS);
    // 读响应数据的超时时间
    HttpConnectionParams.setSoTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
    HttpConnectionParams.setConnectionTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
    HttpConnectionParams.setTcpNoDelay(httpParams, true);
    HttpConnectionParams.setSocketBufferSize(httpParams, DEFAULT_SOCKET_BUFFER_SIZE);
    //设置协议版本...
    HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setUserAgent(httpParams, String.format("andbase-http/%s (http://www.easck.com/)", 1.0));
    // 设置请求参数
    httpRequest.setParams(httpParams);
    
    //取得HttpClient对象 
    HttpClient httpClient = new DefaultHttpClient(); 
    //请求HttpClient,取得HttpResponse 
    HttpResponse httpResponse = httpClient.execute(httpRequest); 
    //请求成功 
    int statusCode = httpResponse.getStatusLine().getStatusCode();
    
    //取得返回的字符串 
    HttpEntity mHttpEntity = httpResponse.getEntity();
    if (statusCode == HttpStatus.SC_OK){ 
     if(responseListener instanceof AbStringHttpResponseListener){
      String content = EntityUtils.toString(mHttpEntity);
      ((AbStringHttpResponseListener)responseListener).sendSuccessMessage(statusCode, content);
     }else if(responseListener instanceof AbBinaryHttpResponseListener){
      readResponseData(mHttpEntity,((AbBinaryHttpResponseListener)responseListener));
     }else if(responseListener instanceof AbFileHttpResponseListener){
      //获取文件名
      String fileName = AbFileUtil.getFileNameFromUrl(url, httpResponse);
      writeResponseData(mHttpEntity,fileName,((AbFileHttpResponseListener)responseListener));
     }
    }else{
     String content = EntityUtils.toString(mHttpEntity);
     responseListener.sendFailureMessage(statusCode, content, new AbAppException(AbConstant.UNKNOWNHOSTEXCEPTION));
    }
  } catch (Exception e) {
   e.printStackTrace();
   //发送失败消息
   responseListener.sendFailureMessage(AbConstant.UNTREATED_CODE,e.getMessage(),new AbAppException(e));
  }finally{
   responseListener.sendFinishMessage();
  }
 }