Android开发学习之网络技术

Posted 哈喽喔德

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发学习之网络技术相关的知识,希望对你有一定的参考价值。

(学习参考书:第一行代码第2版)

一、WebView的用法

借助WebView控件,我们可以在自己的应用程序中嵌入一个浏览器,从而展示各种各样的网页。使用方法如下:

  1. 在布局文件中添加WebView,在活动中获取WebView的实例
  2. 调用getSetting()方法设置浏览器的属性。如setjavascriptEnabled()方法来让WebView支持js脚本
  3. 调用WebView的setWebViewClient()方法,并传入一个WebViewClient实例。作用为从一个网页跳转到另一个网页时,希望在目标网页中任然在当前WebView中显示,而不是打开系统浏览器。
  4. 调用WebView的loadUri()方法,并将网址传入
  5. androidManifest中声明权限并且在application中添加属性:android:usesCleartextTraffic=“true”

二、使用 HTTP协议访问网络

工作原理为客户端向服务器发出一条HTTP请求,服务器收到请求之后会返回一些数据给客户端,客户端吧再对这些数据进行解析和处理。

(1)使用HttpURLConnection

首先获取到HttpURLConnection的实例,一般是new一个URL对象,传入目标的网络地址,然后调用你openConnection()即可

URL url = new URL("http://www.baidu.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

得到HttpURLConnection的实例后,可以设置以下HTTP请求所使用的方法。常用的方法主要有两个:GET和POST。GET表示从服务器那里获取数据,POST表示希望提交数据给服务器。

connection.setRequestMethod("GET");

接下来进行一些自由定制,比如设置连接超时、读取超时的毫秒数、服务器希望得到的一些消息头等。如:

connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);

之后调用getInputStream()方法就能获取到服务器返回的输入流了,剩下的任务就是读取。

InputStream in = connection.getInputStream();

最后调用disconnect()方法将这个HTTP连接关闭掉

connection.disconnect();

如果是想给服务器提交数据,,只需要将请求方法改为POST,并在获取输入流之前把要提交的数据写出即可。每条数据都要以键值对的形式存在,数据和数据之间用&隔开。

(2)使用OkHttp

使用OkHttp之前,需要在项目在项目中添加OkHttp库的依赖。在app/build.gradle文件的dependencies闭包下添加如下内容:

implementation("com.squareup.okhttp3:okhttp:4.9.1")

最新版本号可通过OkHttp的项目主页地址获取:

https://github.com/square/okhttp

添加如上以来系统会下载两个库,一个是OkHttp库,一个是Okio库,后者是前者的通信基础。OkHttp具体用法如下:

  1. 创建一个OkHttpClient的实例
  2. 如果想要发起一条请求,需要创建一个Request对象
  3. 在调用最终的build()方法之前连缀很多其他方法来丰富这个Request对象。比如可以通过url()方法来设置目标的网络地址
  4. OkHttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据
  5. 其中Response对象就是服务器返回的数据了。我们可以使用如下写法来得到返回的具体内容
  6. 如果是发起POST请求会比GET复杂一点,首先需要构建一个RequestBody对象来存放待提交的参数
  7. 然后在Request.Builder中调用post()方法,并将RequestBody对象传入
  8. 剩余步骤与GET请求一样,调用execute()方法来发送请求获得服务器返回的数据
//1
OkHttpClient client = new OkHttpClient();
//2,3
Request requestGet = new Request.Builder()
        .url("http://www.baidu.com")
        .build();
//4
Response responseGet = client.newCall(requestGet).execute();
//5
String responseData = responseGet.body().string();
//6
RequestBody requestBody = new FormBody.Builder()
        .add("name","admin")
        .add("password","123456")
        .build();
//7
Request requestPost = new Request.Builder()
        .url("http://www.baidu.com")
        .post(requestBody)
        .build();
//8
Response responsePost = client.newCall(requestPost).execute();

三、解析JSON格式

程序一般会在网络上传输格式化后的数据,这些数据会有一定的结构规格和语义,当另一方收到数据消息之后就可以按照相同的结构规格进行解析,从而取出他想要那部分内容。
在网络上传输数据的常用格式有两种:XML和JSON;主流是JSON格式。

(1)使用JSONObject

  1. 使用OkHttp之类的方法得到字符串数据后,将其传入一个自定义的方法处理
  2. 在该方法中将得到的字符串数据转换为一个JSONArray对象。
  3. 然后循环遍历整个JSONArray对象,每取出一个元素都是一个JSONObject对象。只需要再对这个JSONObject对象调用getString方法就可以将数据取出

(2)使用GSON

GSON是谷歌提供的开源库,使用前必须在项目中添加GSON库的依赖。在dependencies闭包下添加:

implementation 'com.google.code.gson:gson:2.8.6'

最新的版本通过官网查询:

https://github.com/google/gson

GSON可以将一段JSON格式的字符串自动映射成一个对象,从而不需要手动编写代码进行解析。
如果一段json格式如:{“name”:”Tom”,”age”:”20”}
那么可以定义一个Person类,加入name和age两个字段,然后只需要简单调用如下代码就可以将JSON数据自动解析为一个Person对象:

Gson gson = new Gson();
Person person = gson.fromJson(jsonData,Person.class);

如果是解析一段JSON数组需要借助TypeToken将期望解析成的数据类型出传入到fromJson()方法中

List<Person> people = gson.fromJson(jsonData,new TypeToken<List<Person>>(){}.getType());

以上是关于Android开发学习之网络技术的主要内容,如果未能解决你的问题,请参考以下文章

Android开发学习之OkHttp框架

Android开发学习之OkHttp框架

Android学习之基础知识十四 — Android特色开发之基于位置的服务

Android开发学习之通知

Android开发学习之Retrofit框架

Android开发学习之Retrofit框架