zoukankan      html  css  js  c++  java
  • android 网络交互

    一、

    在Android中,发送和处理http请求实在太常见了,以至于我们经常需要写这方面的代码。

    Android中网络交互的代码不能在UI线程中执行,只能在额外的子线程中执行。

    我一般的做法是通过创建子线程和Handler来完成,网络交互的代码在线程中执行,交互的结果通过Handler反馈给UI线程。

    new Thread(){
                public void run() {
                    //http请求的发送与接收代码
                    //将操作接口通过handler通知页面
                };
            }.start();

    还有一种交互的方式是通过回调函数callback来实现。

    二、

    发现了一个网络交互的库:android-async-http,前段时间尝试着用了一下,感觉挺棒的。

    这个库,他网络交互的代码都已经封装在里面,通常一个http请求只需要简单的几行代码即可完成。

    它与UI交互的方式是通过回调函数callback来实现,内容比较完成,其中网络交互的开始,结束,成功,失败,进度等等都可以通过callback得到

    第一步:得到httpclient对象

    AsyncHttpClient client = new AsyncHttpClient(); //这一步可以我们自己封装成单例模式

    第二步:发送get请求

    client.get(url.toString(), responseHandler);
    
    //这个地方的responseHandler,假如我们需要得到这个请求的相关返回值,就需要重写实现这个类,并且重写其中的方法;假如不需要的话,使用null代替即可 JsonHttpResponseHandler responseHandler
    = new JsonHttpResponseHandler(){ public void onSuccess(int statusCode, org.apache.http.Header[] headers, org.json.JSONObject response) { super.onSuccess(statusCode, headers, response); }; public void onFailure(int statusCode, org.apache.http.Header[] headers, Throwable throwable, org.json.JSONObject errorResponse) { super.onFailure(statusCode, headers, throwable, }; @Override public void onFinish() { super.onFinish(); };
         //还有很多其他可以重写的方法,基本包括交互过程中所有的状态
    }

    三、

    觉得这个库写的很棒,各种高大上,简单的读了一下其中的源码,他在github上是开源的。

    每一个请求,都被封装在一个runnable中,执行这个请求的时候,ExecutorService.submit(runnable)将该runnable放在线程池中执行

    根据用户提供的网络路径和键值对,创建HttpUriRequest对象,通过HttpResponse response = client.execute(HttpUriRequest, httpContext)来执行网络操作

    HttpUriRequest,它是一个接口,它有多个子类,其中包含HttpEntityEnclosingRequestBase;HttpEntityEnclosingRequestBase包含setURI()和setEntity(HttpEntity entity) 的方法。

    请求发送之后,该方法会返回一个叫RequestHandle的对象,通过该对象的cancel方法,可以实现取消请求的方法

    这里只是对库里面的主要方法进行描述,其中还有很多其他的内容,比如gzip,比如base64等等

    四、

    包含的功能:

    1. 发送异步http请求,在匿名callback对象中处理response;
     
    2. http请求发生在UI线程之外;
     
    3. 内部采用线程池来处理并发请求;
     
    4. GET/POST 参数构造,通过RequestParams类。
     
    5. 内置多部分文件上传,不需要第三方库支持;
     
    6. 流式Json上传,不需要额外的库;
     
    7. 能处理环行和相对重定向;
     
    8. 和你的app大小相比来说,库的size很小,所有的一切只有90kb;
     
    9. 自动智能的请求重试机制在各种各样的移动连接环境中;
     
    10. 自动的gzip响应解码;
     
    11. 内置多种形式的响应解析,有原生的字节流,string,json对象,甚至可以将response写到文件中;
     
    12. 永久的cookie保存,内部实现用的是Android的SharedPreferences;
     
    13. 通过BaseJsonHttpResponseHandler和各种json库集成;
     
    14. 支持SAX解析器;
     
    15. 支持各种语言和content编码,不仅仅是UTF-8。
  • 相关阅读:
    wince5.0 key
    CSS基础知识思维导图xmind
    切图
    头部标签集
    List和Set的区别
    PicGo + Gitee 实现 Markdown 图床
    GitHub Pages 与 Gitee Pages 上的 Jekyll
    Agile, CI/CD,DevOps
    你还不了解DevOps? 看这篇就够了
    DevOps实践心得
  • 原文地址:https://www.cnblogs.com/zhou-guobao/p/4650588.html
Copyright © 2011-2022 走看看