您现在的位置是:首页 > 正文

android后台如何获取客户端传来的值,Android:使用OkHttp框架与后台通讯、获取数据...

2024-01-30 21:21:16阅读 0

摘要:本文介绍了Android应用如何与服务器通讯的一些机制,并分享了笔者的一些开发经验与技巧,经过具体的代码描述OkHttp框架的使用,适合初学者。前端

对于初学者来讲,先后端一手抓很常见,若是你想要了解一点后台开发的话,那么建议看一下个人另外一篇文章:

Java后台开发,轻量级框架Spring+SpringMVC+MyBatis (SSM)的使用java

1 - 引言

不太严谨地说,接入网络的终端(手机、主机等)都是经过网络层(IP层)的报文/数据报进行沟通的。具体能够参考百度百科-五层因特网协议栈的一些介绍,咱们只须要了解一些基本原理就行了。(不过作网络应用开发仍是应该学一点计算机网络的~)android

狭义的理解,先后端通讯的媒介就是Http报文,咱们要作的就是 Android 前端发送Http报文,后端服务器接收并处理,而后返回一个结果报文。git

74897090b762ae993bd6a28402dfa275.png

而我接下来介绍的OkHttp框架就是一个比较流行的HTTP框架,它提供封装好的方法来帮助打包咱们要提交或者请求的数据,并帮助咱们发送到服务器。github

2 - 初尝 OkHttp

2.1 一些准备

使用Android Studio的同窗先添加依赖implementation com.squareup.okhttp3:okhttp:3.11.0' ,使用Eclipse的同窗只能本身找包了(不过新手仍是建议使用Android Studio,比较智能)。web

在写博文的时候OkHttp仍是3.11.0版本,最新版仍是请查看OkHttp-GitHub。后端

此外还要在 AndroidManifest 文件中添加网络权限App才能联网:

安全

2.2 Http 请求类型

Http请求有POST、GET、DELETE、PUT等方式,在Android里咱们通常只会使用到两种,POST、GET。服务器

POST:能够在报文内部(咱们也能够称为body)添加参数,提交数据到服务器。

GET:也容许携带参数,不过参数要跟在指定的URL后面,如Http://localhost:8080?param=xxx & param=yyy, 参数以键-值对的形式拼接,多个参数须要使用 & 符号。但这种形式安全性低,因此GET通常只用来请求一些数据,如请求百度的首页。一些把密码、我的信息等看成参数,明文发送的请求实在不是很明智。网络

那么怎么选择使用GET仍是POST呢?

笔者分享一下本身在大学作开发的经历,但愿能帮到你们。使用哪种方法通常不是由前端开发人员决定的,而是后端开发人员根据前端的需求制做接口文档,里面详细记录了各类接口的URL、参数、返回值、注意事项等,前端开发人员对照文档使用便可。好比下面这个场景:

角色:前端技术人员小李,后端技术人员大明

小李:大明哥,咱们前端组最近要实现登陆的功能啦,你帮咱们写个接口呗!

大明:哦哦,收到收到,有什么参数吗?

小李:传个用户名和密码就好了。

大明:行,那用户名用u_name表示,密码用u_password表示,行不?

小李:OK!对了,两个参数都是字符串类型的,字符集用UTF-8。

大明:没问题,迟点我把接口文档给大家组发过去。

小李:OK,辛苦辛苦~

(实际上并不会这么和谐~~ 需求一时爽,@&%#……)

若是你刚好参与了接口设计的讨论,那么不妨了解一下什么是REST风格,它是HTTP协议1.1版本制定的重要部分。简单来讲就是POST、GET对应着网络资源的增长和获取,如上传一张图片对应着服务器文件资源的增长,加载图片对应着资源的获取。

2.3 Get 请求实例

使用OKHttp的同步GET方法:这里仍是沿用《第一行代码》请求百度首页的栗子。

OkHttpClient client = new OkHttpClient(); //新建客户端处理请求

Request request = new Request.Builder()

.url("http://www.baidu.com") //添加要请求的URL

.build();

try{

response = client.newCall(request).execute(); //执行这个Http请求

String result = response.body().string(); //获取Http响应报文的结果

}catch(Execption e){

e.printStackTrace();

}

上面的栗子运行以后就会获取百度首页的HTML数据。很简单的同步请求数据栗子,固然咱们还能够在URL后面添加一些参数给服务器处理。

OKHtttp的异步GET请求百度首页:

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()

.url("http://www.baidu.com")

.build();

//前面仍是同样的,可是下面就是重点了

Call call = client.newCall(request);

//添加到消息队列里,传入Callback,当响应报文回来时执行相应的回调方法

call.enqueue(new Callback{

@Override

public void onFailure(Call call, IOException e){

/*

* 请求失败的一些操做

*/

}

@Override

public void onResponse(Call call, Response response){

try{

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

}catch(Exception e){

e.printStackTrace();

}

}

});

2.4 POST 请求实例

POST方法的同步、异步几乎和GET是同样的,只须要多构建一个RequestBody,用来保存参数。

OkHttpClient client = new OkHttpClient();

ReuquestBody body = FormBody.Builder() //构建body

.add("key","value") //添加参数的键值对,可屡次add()

.build();

Request request = new Request.Builder()

.url("xxx")

.post(body) //将body加进来

.build();

/*

* 接下来的操做和以前的Get相同

*/

3 - Http 同步和异步(重点)

3.1 区别

对于同步的 Http 请求来讲,“发送请求”和“接受结果”是一个有序的过程,程序须要等待结果的返回并处理。一旦请求发出,线程必须处理结果,若是结果没有返回,线程一直等待就有可能被阻塞。线程与Http请求/响应是同步的,线程不能抛开Http请求/响应去作其余事情。

对于异步的 Http 请求来讲,程序“发送请求”以后不须要等待结果,能够去作其余事情。等 Http 响应返回的时候,再调用相应的回调方法处理报文就行。线程与Http请求/响应是异步,线程实际上已经和 Http 请求/响应分开了。

3.2 选择

既然同步和异步都能实现Http请求,那么咱们选择同步仍是异步呢?

这就引出一个机制:在Android的主线程(也叫UI线程)里不容许有耗时操做,由于这会有阻塞线程的风险,而 Http 请求刚好就是耗时操做。(重点)

Http 是耗时操做仍是很好理解的,由于网络的不肯定性,当网络拥塞的时候报文有可能被阻挡在某个网络节点上,一直得不到响应也很正常。

咱们绝大多数请求都是在Activity里写的,好比加载某我的的资料,那么在开启查看资料的Activity的时候就应该向服务器发出一个Http请求。若是咱们直接在onCreate(),onStart(),onResume() 这些方法里添加上面的 同步请求 的代码,妥妥的崩溃。

那是否是咱们就不能使用 Http 同步请求了呢?固然不是,咱们的程序不止只有UI线程。咱们还有多线程这个大利器。

3.3 解决方案

异步Http请求,异步方法前面已经说了。由于异步请求实际和主活动并不在同一个线程,也就不怕阻塞主线程了。

为同步 Http 请求开启一个新线程,将同步代码放在新线程中,那么就会将请求与UI线程分离了。

不懂 Java 多线程的朋友也不用担忧,代码十分简单,以下:在[1]区域中替换为相应的同步Http请求便可。

public void networkTask(){

new Thread(){

@Override

public void run(){

/*

* [1] 同步请求加到这里

*/

}

}.start();

}

看了同步Http的开启线程的操做,其实咱们也明白了,在Anrdoid中,同步请求并不能真的和Activity同步,不然就崩了。(吐槽同步请求还有何用?)

3.5 补充

总结前面的知识,实际上咱们的Http请求都是在另一条线程执行的,是异步的。但即便代码都写在同一个 .java 文件中,数据在不一样线程是不能直接传递的。但有时候咱们须要使用 Http 请求返回的数据来更新UI,怎么在UI线程中使用这些数据呢?

对于异步请求来讲,咱们在须要在对应的回调方法,onFailure()或者onResponse()中添加下面的代码:

final String result = response.body().string();

MainActivity.this.runOnUIThread(new Runable(){

@Override

public void run(){

/*

* 这里写的东西都会在UI线程执行,咱们能够将result传进来

* 也能够在这里获取主线程View的实例,更新UI

* 注意result要添加final修饰,不然会报错

*/

}

});

而对于开启新线程的同步请求来讲,须要将上面这段代码添加到同步请求的返回结果以后,以下:

public void networkTask(){

new Thread(){

@Override

public void run(){

// 构建请求

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()

.url("http://www.baidu.com")

.build();

try{

response = client.newCall(request).execute(); // 执行

final String result = response.body().string(); // 结果

/*

* runOnUIThread 部分加到这里

*/

}catch(Execption e){

e.printStackTrace();

}

}

}.start();

}

能够看出来,为了在其余线程通知主线程,咱们用到了runOnUIThread(Runable)这个方法。

特别注意:由于网络时延的缘由,View的加载都会快于响应报文的数据回传。千万不要觉得将Http请求写在View加载以前就能成功更新UI,每每这种方式都会出现空指针异常。 (重要)

正文结束,欢迎留言讨论。

网站文章

  • 计算机主机板开机原理与维修,主机板损坏电脑会出现什么现象

    计算机主机板开机原理与维修,主机板损坏电脑会出现什么现象

    主机板损坏电脑会出现什么现象以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!主机板损坏电脑会出现什么现象音效卡坏了不造成开...

    2024-01-30 21:21:08
  • Android 平滑和立体翻页效果2

    Android 平滑和立体翻页效果2

    http://www.ibm.com/developerworks/cn/opensource/os-cn-android-anmt2/Android launcher 的平滑和立体翻页效果我们这里把 Android launcher 程序的 Workspace 相关的代码抽取出来,以一个比较简单的代码来展示 launcher 程序是如何实现多页以及不同页面之间的切换效果。本示例代

    2024-01-30 21:20:40
  • 配置zabbix邮件报警

    配置zabbix邮件报警

    管理–>报警媒介类型–>Email进行配置,点击更新其中密码不是登录密码,是授权码点击测试查看邮箱修改默认报警模板。

    2024-01-30 21:20:33
  • Java中4大基本加密算法解析

    简单的java加密算法有:BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authentication Code,散列消息鉴别码)1. BASE64Base64是网络上最常见的用于传输8Bit字节代...

    2024-01-30 21:20:25
  • Jmeter+ SeureCRT + Pinpoint

    1、环境配置[相关操作]下载jdkhttp://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html配置java环境变量#配置javaJAVA_HOME=/Library/Java/JavaVirtualMa...

    2024-01-30 21:20:18
  • 程序员面试、算法研究、编程艺术、红黑树、机器学习5大经典原创系列集锦与总结

    程序员面试、算法研究、编程艺术、红黑树、机器学习5大经典原创系列集锦与总结

    程序员面试、算法研究、编程艺术、红黑树、机器学习5大经典原创系列集锦与总结 (七月在线:https://www.julyedu.com/,面试 & 算法 & 机器学习在线课程)作者:J...

    2024-01-30 21:19:48
  • ES6中如何求两个数组的交集

    ES6中如何求两个数组的交集

    这两种方法都可以求解两个数组的交集,具体选择哪种方法取决于个人偏好和具体的应用场景。求两个数组的交集是指找出两个数组中共同存在的元素。在ES6中,我们可以使用一些数组方法和语言特性来实现这个功能。是一...

    2024-01-30 21:19:42
  • 学业水平考试高二计算机,高二计算机学业水平测试 模拟试题(附答案)

    该楼层疑似违规已被系统折叠隐藏此楼查看此楼2.利用Flash软件制作一个15帧的“矩形变为圆形”的渐变动画,并以”xzjb”为文件名,保存到当前文件夹下。(6分)•(1)在第一帧位置上,选中“矩形工具”画一矩形;(2)选中第15帧,打开“插入”菜单选择插入“空白关键帧”;(3)点中“椭圆工具”,按住“Shift”键,在第15帧处画一正圆;(4)单击帧面板的第1帧,在窗口下方显示出“帧”属性面...

    2024-01-30 21:19:34
  • 浏览器软件下载,点击超链接、图标等直接下载(前后端代码)

    java下载工具类

    2024-01-30 21:19:05
  • SpringMVC之ModelFactory

    ModelFactory是用来维护Model的,具体包含两个功能1、初始化Model2、处理器执行后将Model中相应的参数更新到SessionAttributes中public void initModel(NativeWebRequest request, ModelAndViewContainer mavContainer, HandlerMethod handlerMethod) ...

    2024-01-30 21:18:58