(学习参考书:第一行代码第2版)
一、WebView的用法
借助WebView控件,我们可以在自己的应用程序中嵌入一个浏览器,从而展示各种各样的网页。使用方法如下:
- 在布局文件中添加WebView,在活动中获取WebView的实例
- 调用getSetting()方法设置浏览器的属性。如setJavaScriptEnabled()方法来让WebView支持js脚本
- 调用WebView的setWebViewClient()方法,并传入一个WebViewClient实例。作用为从一个网页跳转到另一个网页时,希望在目标网页中任然在当前WebView中显示,而不是打开系统浏览器。
- 调用WebView的loadUrl()方法,并将网址传入
- 在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具体用法如下:
- 创建一个OkHttpClient的实例
- 如果想要发起一条请求,需要创建一个Request对象
- 在调用最终的build()方法之前连缀很多其他方法来丰富这个Request对象。比如可以通过url()方法来设置目标的网络地址
- OkHttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据
- 其中Response对象就是服务器返回的数据了。我们可以使用如下写法来得到返回的具体内容
- 如果是发起POST请求会比GET复杂一点,首先需要构建一个RequestBody对象来存放待提交的参数
- 然后在Request.Builder中调用post()方法,并将RequestBody对象传入
- 剩余步骤与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();
(3)开发中的封装
发送HTTP请求的代码基本都是相同的,通常在开发过程中,将通用的网络操作提取到一个公共的类中,比你高提供一个静态方法,当想要发起网络请求的时候,只需要简单调用一下这个方法即可。可以向下面那样:
public class HttpUtil {
public static void sendOkHttpRequest(String address, Callback callback){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(address)
.build();
client.newCall(request).enqueue(callback);
}
}
不是之前调用execute()方法,而是最后调用的enqueue()方法。在需要执行请求的时候:
HttpUtil.sendOkHttpRequest("http://www.baidu.com", new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
//处理异常情况
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
//得到服务器返回的具体内容
String responseData = response.body().string();
}
});
通过回调方法到达处理返回数据的目的。
三、解析JSON格式
程序一般会在网络上传输格式化后的数据,这些数据会有一定的结构规格和语义,当另一方收到数据消息之后就可以按照相同的结构规格进行解析,从而取出他想要那部分内容。
在网络上传输数据的常用格式有两种:XML和JSON;主流是JSON格式。
(1)使用JSONObject
- 使用OkHttp之类的方法得到字符串数据后,将其传入一个自定义的方法处理
- 在该方法中将得到的字符串数据转换为一个JSONArray对象。
- 然后循环遍历整个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());