1.WebView用法
- 首先实现网络权限注册
< uses-permission android:name="android.permission.INTERNET" />
- 然后实现请求
- 注册表添加
android:usesCleartextTraffic="true"
2.使用HTTP协议访问网络
WebView已经在后台帮我们处理好了发送HTTP请求、 接收服务响应、 解析返回数据,以及最终的页面展示这几步工作
2.1 HttpURLConnection
实例:
客户端从服务器获取到的是HTML代码
如果是想要提交数据给服务器只需要将HTTP请求的方法改成POST,并在获取输入流之前把要提交的数据写出即可。注意每条数据都要以键值对的形式存在,数据与数据之间用“&”符号隔开
connection.setRequestMethod("POST");
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes("username=admin&password=123456");
2.2 OkHttp
- 添加依赖
implementation "com.squareup.okhttp3:okhttp:4.4.0"
- 开源项目最新依赖
- 开启网络权限
< uses-permission android:name="android.permission.INTERNET" />
- 使用实例:
private void showResponse(final String response) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// 在这里进行UI操作, 将结果显示到界面上
textView.setText(response);
}
});
}
3.搭建简单Web服务器
- 下载Apache服务器的安装包进行安装,官网需要翻墙
- 需要以管理员身份配置服务
- 配置成功界面
4.解析XML格式数据
4.1 Pull解析
4.2 SAX解析
parseXMLWithSAX(responseDate);
startDocument()方法会在开始 XML解析的时候调用
startElement()方法会在开始解析某个节点的时候调用,
characters()方法会在获取节点中内容的时候调用
endElement()方法会在完成解析某个节点的时候调用
endDocument()方法会在完成整个XML解析的时候调用
5.解析JSON格式数据
解析JSON数据也有很多种方法, 可以使用官方提供的JSONObject, 也可以使用谷歌的开源库GSON。另外,一些第三方的开源库如Jackson、 FastJSON
5.1 使用JSONObject
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
// 指定访问的服务器地址是电脑本机
.url("http://192.168.1.103:80/get_data.json")
.build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
parseJSONWithJSONObject(responseData);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
});
private void parseJSONWithJSONObject(String jsonData) {
try {//先把服务器返回的数据传入得到一个JSONArray对象中
JSONArray jsonArray = new JSONArray(jsonData);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String id = jsonObject.getString("id");
String name = jsonObject.getString("name");
String version = jsonObject.getString("version");
Log.d("MainActivity", "id is " + id);
Log.d("MainActivity", "name is " + name);
Log.d("MainActivity", "version is " + version);
}
} catch (Exception e) {
e.printStackTrace();
}
}
5.2 使用GSON
- 添加依赖
implementation 'com.google.code.gson:gson:2.8.6'
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try{
OkHttpClient okHttpClient=new OkHttpClient();
Request request=new Request.Builder()
.url("http://192.168.1.103:80/get_data1.json")
.build();
Response response=okHttpClient.newCall(request).execute();
String responseData=response.body().string();
parseJSONWithGSON(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
});
private void parseJSONWithGSON(String jsonData){
Gson gson=new Gson();
//对于单个对象 直接将JSON数据解析成App对象
//App app=gson.fromJson(jsonData,App.class);
//对于一组对象 借助TypeToken将期望解析成的数据类型传入到fromJson() 方法中
List<App> appList = gson.fromJson(jsonData, new TypeToken<List<App>>(){}.getType());
for (App app : appList) {
Log.d("MainActivity", "id is " + app.getId());
Log.d("MainActivity", "name is " + app.getName());
Log.d("MainActivity", "version is " + app.getVersion());
}
}
public class App {
private String id;
private String name;
private String version;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
6.将网络操作整合到一起
封装HTTP发送请求代码:HttpUtil
网络请求是耗时操作,如果在sendHttpRequest中开启线程进行请求操作,服务器还没有来得及相应,子线程就已经完成任务,无法返回服务器的数据。所以使用Java回调机制
public interface HttpCallbackListener {
//java回调机制 保证HttpUtil子线程产生的数据可以返回
//onFinish() 方法表示当服务器成功响应我们请求的时候调用 onFinish() 方法中的参数代表着服务器返回的数据
//onError() 表示当进行网络操作出现错误的时候调用 onError() 方法中的参数记录着错误的详细信息。
void onFinish(String response);
void onError(Exception e);
}
具体代码实现(包含HttpUtil的使用):
sendOkHttpRequest2() 方法中有一个okhttp3.Callback 参数, 这个是OkHttp库中自带的一个回调接口,类似于我们刚才自己编写的HttpCallbackListener。 然后在client.newCall() 之后调用了enqueue() 方法, 并把okhttp3.Callback 参数传入。 OkHttp在enqueue() 方法的内部已经帮我们开好子线程,然后会在子线程中去执行HTTP请求,并将最终的请求结果回调到okhttp3.Callback 当中。