• FinalHttp的简要介绍与使用


    http://blog.csdn.net/zhaokaiqiang1992/article/details/30291259?utm_source=tuicool

    在之前的一篇文章中,我们简单的介绍了下FinalBitmap的使用,这一篇文章将继续介绍AFinal开发框架的使用,这一次的主角是FinalHttp。      

    FinalHttp,顾名思义,就是一个用于实现客户端与服务器之间网络通信的类,这个类主要通过对Apache的HttpClient开源项目进行封装,实现了http、https协议下的"GET"和"Post"两种请求方式,以及put、delete、download等功能,我们主要介绍使用FinalHttp实现与服务器的      "GET"和"Post"两种交互方式      。      

    private static final ThreadFactory  sThreadFactory = new ThreadFactory() {
      private final AtomicInteger mCount = new AtomicInteger(1);
      public Thread newThread(Runnable r) {
        Thread tread = new Thread(r, "FinalHttp #" + mCount.getAndIncrement());
        tread.setPriority(Thread.NORM_PRIORITY - 1);
          return tread;
      }
        };
        
        private static final Executor executor =Executors.newFixedThreadPool(httpThreadCount, sThreadFactory);
    首先,FinalHttp采用的是线程池的方式,提供对请求的异步加载,默认的是启动3个固定的线程。而且, 
    tread.setPriority(Thread.NORM_PRIORITY - 1);
    这句代码将这些线程的优先级设置的比普通线程低,目前不知道是出于何种考虑。 

          另外,在FinalHttp的构造函数中,进行了很多属性的初始化操作,包括添加请求头、设置超时的时间、设置重试次数等,代码较多,还请读者自己去阅读。      

    FinalHttp对      "GET"和"Post"进行了非常好的封装,所以使用起来非常简单,下面,我们简要的学习一下FinalHttp的使用。       

            首先,我们可以通过             

    FinalHttp    http    =    new         FinalHttp(); 

    就可以很方便的获取到一个FinalHttp的对象。 

        如果我们想实现最简单的GET请求,比如我们用GET方式,请求百度的主页,我们可以这样做 

    public void get(View view) {
        //这是最简单的get请求,前面是请求地址,不要忘记添加http://
        //后面是一个回调函数,比较常用的方法有下面两个
        http.get("http://www.baidu.com", new AjaxCallBack<String>() {
    
          //当我们请求失败的时候会被调用,errorNo是请求失败之后,服务器的错误码,StrMsg则是错误信息
          @Override
          public void onFailure(Throwable t, int errorNo, String strMsg) {
            super.onFailure(t, errorNo, strMsg);
            Log.d(TAG, strMsg);
          }
    
          //如果请求成功,则调用这个回调函数,t就是服务器返回的字符串信息
          @Override
          public void onSuccess(String t) {
            super.onSuccess(t);
            Log.d(TAG, t);
          }
    
        });
      }
    我们可以看到,用FinalHttp实现GET网络请求,我们不需要自己开线程,因为框架已经封装好了,在内部给我们开的线程,实现网络的异步调用。其实不光有get方法,还有一个getSync,这个方法就是没有进行另起线程的请求,所以,如果我们想用getSync这个方法,我们需要自己开启线程,否则在最新版本的主线程中开启网络服务,会抛异常。 

        当然,这只是最简单的get方法的使用,FinalHttp一共提供了get方法的三种重载,代码如下 

    //------------------get 请求-----------------------
      public void get( String url, AjaxCallBack<? extends Object> callBack) {
        get( url, null, callBack);
      }
    
      public void get( String url, AjaxParams params, AjaxCallBack<? extends Object> callBack) {
        sendRequest(httpClient, httpContext, new HttpGet(getUrlWithQueryString(url, params)), null, callBack);
      }
      
      public void get( String url, Header[] headers, AjaxParams params, AjaxCallBack<? extends Object> callBack) {
        HttpUriRequest request = new HttpGet(getUrlWithQueryString(url, params));
        if(headers != null) request.setHeaders(headers);
        sendRequest(httpClient, httpContext, request, null, callBack);
      }
    第二种方式增加了AjaxParams参数,这个参数负责设置get请求的请求值,就是get请求时url地址后面的 &key1=values1  &key2=values2这种形式的请求参数的设置,内部其实就是通过Map<String,String>实现的,所以使用也和Map一样。但是这个AjaxParams比较强大,我们可以往里面添加很多东西,比如说文件,流等。  

          第三种方式又增加了一个Header数组,这个数组用于设置请求的头信息,其他与以上两种相同。      

    public Object getSync( String url) {
        return getSync( url, null);
      }
    
      public Object getSync( String url, AjaxParams params) {
         HttpUriRequest request = new HttpGet(getUrlWithQueryString(url, params));
        return sendSyncRequest(httpClient, httpContext, request, null);
      }
      
      
      public Object getSync( String url, Header[] headers, AjaxParams params) {
        HttpUriRequest request = new HttpGet(getUrlWithQueryString(url, params));
        if(headers != null) request.setHeaders(headers);
        return sendSyncRequest(httpClient, httpContext, request, null);
      }

    这是getSync的实现,其实和get方法一样,只不过因为需要自己另开线程,所以没有了回调函数这个参数,使用方法相同。 

        下面我们看一下post方法使用。 

    //------------------post 请求-----------------------
      public void post(String url, AjaxCallBack<? extends Object> callBack) {
        post(url, null, callBack);
      }
    
      public void post(String url, AjaxParams params, AjaxCallBack<? extends Object> callBack) {
        post(url, paramsToEntity(params), null, callBack);
      }
    
      public void post( String url, HttpEntity entity, String contentType, AjaxCallBack<? extends Object> callBack) {
        sendRequest(httpClient, httpContext, addEntityToRequestBase(new HttpPost(url), entity), contentType, callBack);
      }
    
      public <T> void post( String url, Header[] headers, AjaxParams params, String contentType,AjaxCallBack<T> callBack) {
        HttpEntityEnclosingRequestBase request = new HttpPost(url);
        if(params != null) request.setEntity(paramsToEntity(params));
        if(headers != null) request.setHeaders(headers);
        sendRequest(httpClient, httpContext, request, contentType, callBack);
      }
    
      public void post( String url, Header[] headers, HttpEntity entity, String contentType,AjaxCallBack<? extends Object> callBack) {
        HttpEntityEnclosingRequestBase request = addEntityToRequestBase(new HttpPost(url), entity);
        if(headers != null) request.setHeaders(headers);
        sendRequest(httpClient, httpContext, request, contentType, callBack);
      }

    上面的代码中,我们可以看出,post与get方法的使用几乎相同,只不过增加了几个新的参数而已。 

        下面是调用post方法的一个简单的示例 

    public void post(View view) {
        http.post("http://www.baidu.com", new AjaxCallBack<String>() {
    
          @Override
          public void onFailure(Throwable t, int errorNo, String strMsg) {
            super.onFailure(t, errorNo, strMsg);
            Log.d(TAG, strMsg);
          }
    
          @Override
          public void onSuccess(String t) {
            super.onSuccess(t);
            Log.d(TAG, t);
          }
    
        });

    我们通过    AjaxParams     可以来添加文件,然后就可以使用post方法,将文件提交到服务器,实现文件的上传。 

    AjaxParams params = new AjaxParams();              params.put("username", "michael yang");              params.put("password", "123456");              params.put("email", "test@tsz.net");              params.put("profile_picture", new File("/mnt/sdcard/pic.jpg")); // 上传文件        params.put("profile_picture2", inputStream); // 上传数据流        params.put("profile_picture3", new ByteArrayInputStream(bytes)); // 提交字节流   

  • 相关阅读:
    [华为]字符串反转
    [华为]字符个数统计
    [华为]字符串分隔
    [华为]计算字符个数
    [华为]字符串最后一个单词的长度
    感悟-思考-生活
    [百度校招]打印全排列
    [阿里]逆序打印整数,要求递归实现
    [百度]数组中去掉连续重复的数字,只保留1个
    百度NLP三面
  • 原文地址:https://www.cnblogs.com/bigben0123/p/4422862.html
Copyright © 2020-2023  润新知