Android网络通信概述

网络通信在App的使用中占据重要地位,要实现网络通信,从宏观上分为两种方式,即:调用原生类和使用第三方框架。

调用原生类

Android中通过原生类进行网络通信时,根据业务场景的不同,主要分为两种方式,分别为HTTP网络请求和Socket网络请求,如图所示:


一. Http通信

在Android中发送Http网络请求一般有三种方式,分别为HttpURLConnection、HttpClient和AndroidHttpClient:

1. HttpURLConnection

继承自URLConnection,是 java.net.* 提供的与网络操作相关的标准Java接口,可用于指定URL并发送GET请求、POST请求。

HttpURLConnection connection = null;
try {
      URL url = new URL("http://www.baidu.com");
      connection = (HttpURLConnection) url.openConnection();
      connection.setRequestMethod("GET");
      connection.setRequestProperty("Charset", "UTF-8");
      connection.setRequestProperty("Content-Type", "text/html;charset=UTF-8");
      connection.connect();
      if (connection.getResponseCode() == 200) {
             InputStream is = connection.getInputStream();
             //do something
      }
} catch (IOException e) {
      e.printStackTrace();
} finally {
      if (null != connection) {
             connection.disconnect();
      }
}
2. HttpClient

Apache提供的Http网络访问接口,也可以完成Http的GET请求和POST请求,一开始被引入到AndroidAPI中,但在Android在6.0后删除了该类库,如果仍然想要使用,需要在build.gradle文件中进行配置,配置如下:

android {
    useLibrary 'org.apache.http.legacy'
}

代码如下:

try {
      HttpGet httpGet = new HttpGet("http://www.12306.cn/mormhweb/");
      HttpClient httpClient = new DefaultHttpClient();
      HttpResponse httpResponse = httpClient.execute(httpGet);
      if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            String resultData = EntityUtils.toString(httpResponse.getEntity(), "utf-8");
            //do something
       }
} catch (Exception e) {
       e.printStackTrace();
}
3.AndroidHttpClient

Android.net.*提供的网络接口,继承自HttpClient常常进行Android特有的网络编程,使用较少。

二. Socket通信

在Android中同样支持Socket通信,是网络通信过程中端点的抽象表示,应用程序与服务器通信可以采用两种模式:TCP可靠通信和UDP不可靠通信。

使用第三方框架

在网络通信过程中,直接使用自带的原生类虽然灵活性比较高,可以根据业务需求进行多种不同配置,但在实际使用中各种功能都需要用户自己去封装定义,因此使用第三方框架就变成了一个很好的选择,常用的第三方框架如下:

okhttp和volley的底层是HttpURLConnection;retrofit是对okhttp的包装,其底层也是HttpURLConnection;android-async-http和xUtils其底层是HttpClient;等其他的第三方库,通过分析可以得到结论,第三方库都是对原生类的功能的封装以及扩展。

一. OkHttp通信

代码如下:

OkHttpClient client = null;
Response response = null;
try {
      client = new OkHttpClient.Builder()
                  .connectTimeout(10000, TimeUnit.MILLISECONDS)
                  .build;
      Request request = new Request.Builder()
                  .url(new Url("www.xxx.com"))
                  .build();
     reponse = client.newCall(request).execute();
      if(response.isSuccessful()){
             //do something
      } else {
            //do something
      }
} catch(Exception e) {
      //do something
} finally {
      if (response != null) {
             response.close();
      }
      if (client != null) {
            client.dispatcher().executorService().shutdown();
            client.connectionPool().evictAll();
      }
}

持续更新ing...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,239评论 25 709
  • 6.1 公钥密钥加密原理 6.1.1 基础知识 密钥:一般就是一个字符串或数字,在加密或者解密时传递给加密/解密算...
    AndroidMaster阅读 9,468评论 1 8
  • 一、简历准备 1、个人技能 (1)自定义控件、UI设计、常用动画特效 自定义控件 ①为什么要自定义控件? Andr...
    lucas777阅读 10,656评论 2 54
  • 昨天终于腾出时间,去看了冯导的《芳华》。整个电影下来,心情都处在一个沉重压抑的情绪中!听到电影院里,时不...
    小路和她的猫阅读 1,796评论 6 2
  • 只要梯子足够长 我就会上到天上 扯来一片祥云 做一双隐形的翅膀 讨来一颗星辰 把长夜的寂寥点亮 我要飞过叶落,飞过...
    江城妖怪阅读 1,319评论 0 2

友情链接更多精彩内容