Android开发学习之网络技术

本文详细介绍了Android中使用WebView加载网页的方法,包括设置WebView属性、处理页面跳转和加载URL。同时,讲解了HTTP协议访问网络的两种方式:HttpURLConnection和OkHttp,包括GET和POST请求的实现。最后,提到了JSON数据解析,推荐了使用JSONObject和GSON库进行解析的方法。
摘要由CSDN通过智能技术生成

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

一、WebView的用法

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

  1. 在布局文件中添加WebView,在活动中获取WebView的实例
  2. 调用getSetting()方法设置浏览器的属性。如setJavaScriptEnabled()方法来让WebView支持js脚本
  3. 调用WebView的setWebViewClient()方法,并传入一个WebViewClient实例。作用为从一个网页跳转到另一个网页时,希望在目标网页中任然在当前WebView中显示,而不是打开系统浏览器。
  4. 调用WebView的loadUrl()方法,并将网址传入
  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();

(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

  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());
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值