Android知识点(十)之网络技术

1.WebView用法

  1. 首先实现网络权限注册
    < uses-permission android:name="android.permission.INTERNET" />
  2. 然后实现请求
    在这里插入图片描述
  3. 注册表添加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

  1. 添加依赖implementation "com.squareup.okhttp3:okhttp:4.4.0"
  2. 开源项目最新依赖
  3. 开启网络权限
    < uses-permission android:name="android.permission.INTERNET" />
  4. 使用实例:
    在这里插入图片描述
private void showResponse(final String response) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // 在这里进行UI操作, 将结果显示到界面上
                textView.setText(response);
            }
        });
    }

3.搭建简单Web服务器

  1. 下载Apache服务器的安装包进行安装,官网需要翻墙
  2. 需要以管理员身份配置服务
    在这里插入图片描述
  3. 配置成功界面
    在这里插入图片描述

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

在这里插入图片描述

  1. 添加依赖
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 当中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值