网络的使用-安卓基础知识整理

来源:互联网 发布:一屋窑玻璃茶具淘宝 编辑:程序博客网 时间:2024/05/16 11:23

做一个可以上网的APP在现在已经是移动开发必备的技能了,互联网时代为应用程序提供了实现更多强大功能的基础。本文我将会介绍一下怎么在自己的app中使用网络技术,我这里讲的是使用HTTP协议和服务器端进行网络交互,并对服务器返回的数据进行解析。

目录

    • 使用HTTP协议访问网络
      • 使用HttpURLConnection
      • 使用OkHttp
    • 对返回数据进行处理-解析JSON格式数据
      • 使用JSONObject
      • 使用GSON

使用HTTP协议访问网络

对于HTTP协议,我们只要了解它的工作原理就好了,其实也挺简单,就是客户端向服务器发出一条HTTP请求,服务器收到请求之后会返回一些数据给客户端,然后客户端在对这些数据进行解析和处理就可以了。接下来说一下具体怎么写:

使用HttpURLConnection

在以前Android上发送HTTP请求一般有两种方式:HttpURLConnection和HttpClient。不过后者存在API数量过多、扩展困难等缺点,所以Android团队越来越不建议我们使用这种方式。终于在Android6.0系统中HttpClient功能被完全以述了,标志着此功能正式被弃用,所以我们现在都用HttpURLConnection了。

使用HttpConnection首先需要获取一个他的实例,一般只需要new一个URL对象,并传入目标网络地址,然后调用一下openConnection()方法获得的即是HttpConnection的一个实例,而不需要像平时那样new一个,如下所示:

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

然后我们先设置一下HTTP请求使用的方法。常用的一般是GET 和POST,看名字就知道GET是从服务器获取数据,POST是提交数据给服务器。写法:

connection.setRequestMethod("GET");

接下来就可以设置一下比如连接超时、读取超时的毫秒数,注意这里是以毫秒为单位的,1000ms=1s啊记住了啊。或者一些服务器希望得到的消息头(header)。这部分就比较自由了,根据实际情况而定,示例:

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

这下我们可以说是连上服务器了,调用getInputStream()方法就可以获取到服务器返回的输入流了,剩下就是对输入流进行读取,然后就可以获取到服务器端返回的数据了:

InputStream inputStream = connection.getInputStream();

最后完了之后我们需要记得调用disconnect()方法将这个HTTP连接关闭,如下所示:

connection.disconnect();

注意:网络请求属于耗时操作,记得需要开启线程来发起网络请求
多线程的使用可以参考一下这里:
Android多线程篇(上)-安卓基础知识整理
Android多线程篇(下)-安卓基础知识整理

使用OkHttp

当然了,进行网络请求并不是只有HttpConnection,实际上现在开源盛行,有许多出色的网络通信库都可以替代原生的HttpConnection,而其中OkHttp就是做的最出色的一个。

在使用OkHttp前,我们需要在项目中添加OkHttp库的依赖。使用一些不是内置的都需要添加依赖,毕竟本来没有,不添加用不了这个应该都懂吧。编辑项目下app/build.gradle文件,在dependencies闭包中添加如下内容:

dependencies{    ...    compile 'com.squareup.okhttp3:okhttp:3.8.1'}

其中3.8.1是我写的时候最新的版本。添加完之后Built一下项目会自动下载两个库,一个OkHttp库,一个Okio库,后者是前者的基础。然后我们就可以开始使用OkHttp了

首先创建一个实例:

OkHttpClient client = new OkHttpClient();

接下来如果想发起一条HTTP协议请求,就需要创建一个Request对象:

Request request = new Request.Builder().build();

这个Request只是一个空的对象,我们可以在build()前面连缀很多其他方法来丰富这个Request对象。比如这样(设置目标网络地址):

Request request = new Request.Builder()        .url("http:/www.baidu.com")        .build();

之后调佣OkHttp的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据,写法如下:

Response response = client.newCall(request).execute;

其中Response对象就是服务器返回的数据了,我们可以使用如下写法来得到返回的具体内容:

String responseData = response.body().string();

如果是POST请求回避GET请求稍微复杂一点,我们需要先构建出一个RequestBody对象来存放待提交的参数,如下:

RequestBody requestBody = new FormBody.Builder()            .add("uername","admin")            .add("password","123456")            .build();

然后再Request.Builder中调用一下post()方法,将RequestBody对象传入:

Request request = new Request.Builder()        .url("http://www.baidu.com")        .post(requestBody)        .build();

接下来就可以调用execute()方法来发送请求并获取服务器返回数据了!
OkHttp基本使用就是这样了,大概流程:编辑并创建请求->发送请求并获取返回数据,还是挺简单的吧。

对返回数据进行处理-解析JSON格式数据

使用HTTP协议获取到了服务器的返回数据,但是这个返回数据我们要怎么处理呢?返回的是什么样子的数据?我们现在介绍返回数据的其中一种格式——JSON格式,除此之外还有XML格式,不过对比起XML格式,JSON主要优势在于它体积小,省流量,缺点在于语义性较差,看起来不如XML直观。接下来就介绍怎么去解析JSON格式的数据

使用JSONObject

解析JSON有挺多方法的,可以用官方的JSONObject,也可以使用谷歌的开源库GSON,还有很多很多其他的,说完JSONObject之后就说一下GSON怎么用。

假设我们已经通过OkHttp拿到了服务器返回的数据了,大概这样子(JSON就是这种格式,可以先去了解一下JSON再来看):

[{"id":"5","version":"5.5","name":"Clash of Clans"},{"id":"6","version":"7.0","name":"Boom Beach"},{"id":"7","version":"3.5","name":"Clash Royale"}]

我们写一个方法来对它进行处理(数据已经转化为String(jsonData),再传给方法):

private void parseJSONWithJSONObject(String jsonData){        try {            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(TAG,"id is " + id);                Log.d(TAG,"name is " + name);                Log.d(TAG,"version is " + version);            }        }catch (Exception e){            e.printStackTrace();        }    }

这样我们就拿到了它的每一个json的每一个键并打印出来,也是挺简单的吧。我们再来看看用GSON怎么解析吧

使用GSON

GSON相比JSON,它能直接把一段JSON格式的的字符串自动映射成一个对象,从而不需要我们在手动去编写代码进行解析(getString什么的)

比如一段JSON格式的数据:

{"name":"Tom","age":"20"}

我们可以定义一个Person类,并加入name和age这两个字段,然后简单的调用一下代码就可以将JSON数据自动解析成一个Person对象了:

Gson gson = new Gson();Person person  = gson.fromJson(jsonData,new TyppeToken<List<Person>>(){}.getType());

好了,基本用法就是这样了,还是挺简单的吧?然后我们就可以用people这个对象提取内容了。具体怎么用看具体情况而定吧。

本文内容均出自《第一行代码》(第二版)~~~