热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android之Okhttp初级使用

1.OkHttp的初步了解:什么是okhttp,okhttp是一个处理网络请求的开源项目,是由Square公司贡献的,是一个

1.OkHttp的初步了解:


什么是okhttp,okhttp是一个处理网络请求的开源项目,是由Square公司贡献的,是一个轻量级的框架。使用okhttp有什么优势呢?

1.允许连接到同一个主机地址的所有请求,提高请求效率

2.共享Socket,减少请求延迟

3.缓存响应数据来减少重复的网络请求

4.减少对数据流量的消耗

5.自动处理GZip压缩




okhttp的功能:

1.最普通的get,post请求

2.文件的上传下载

3.加载图片

4.支持请求回调,直接返回对象,对象集合

5.支持session的支持







2.okhttp的初步使用:


1.创建OkHttpClient对象,并设置连接超时时间

OkHttpClient mokHttpClient = new OkHttpClient();




2.通过build来创建一个Request请求,没有设置get,直接设置一个url地址,默认是get方式请求

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




3.创建一个call对象,参数是request请求对象,发送请求

Call call = mOkHttpClient.newCall(request);

//请求加入调度

call.enqueue(new Callback()

{

//请求失败执行的方法

public void onFailure(Request request,IOException e){}

//请求成功的执行方法,response是从服务器得到的参数,request.body()可以得到任意类型,字符串,字节

public void onResponse(final Response response) throws IOException{

//获取服务器的字符串

}




});




总结就是首先构造一个Request对象,参数必须有url参数,通过Request对象去构造一个Cal对象,类型将请求封装成任务,既然是任务,就有execute()和cancel()方法

最后,以异步的方式执行请求(网络请求一般都是异步),所以调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,在Callback中得到结果。post方式与get请求格式基本一致,就是request的构造不同。




3.简单例子


1.首先添加依赖,在build.gradle添加依赖:

compile 'com.squareup.okhttp3:okhttp:3.2.0'compile 'com.squareup.okio:okio:1.7.0'为什么要依赖okio呢,因为okhttp内部依赖okio






2.创建布局文件:

布局文件很简单,就是一个textView,然后给textView添加点击事件





3.编写java代码

private void getHttp(){//创建OkHttpClient对象mOkHttpClient = new OkHttpClient();//通过build创建一个rqquest请求Request.Builder requestBuilder = new Request.Builder().url("http://www.baidu.com");//可以省略 默认是GET请求requestBuilder.method("GET",null);Request request = requestBuilder.build();Call mCall = mOkHttpClient.newCall(request);//异步请求mCall.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_SHORT).show();}@Overridepublic void onResponse(Call call, Response response) throws IOException {Log.d("TestService","MianActivity 线程是:" +Thread.currentThread().getId());if(null != response.cacheResponse()){//如果有缓存String str = response.cacheResponse().toString();}else{//从服务器拿到参数response.body().string();}//切回到主线程runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this,"成功",Toast.LENGTH_SHORT).show();}});}});}上面用了异步的请求方式,更新UI要切回到主线程。验证是否开了另一个线程结果如下:



完整的代码:

public class MainActivity extends Activity implements View.OnClickListener {private TextView text_get;private OkHttpClient mOkHttpClient;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);text_get = (TextView)findViewById(R.id.text_get);Log.d("TestService","MianActivity 线程是:" +Thread.currentThread().getId());text_get.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.text_get:// Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_SHORT).show();getHttp();break;}}private void getHttp(){//创建OkHttpClient对象mOkHttpClient = new OkHttpClient();//通过build创建一个rqquest请求Request.Builder requestBuilder = new Request.Builder().url("http://www.baidu.com");//可以省略 默认是GET请求requestBuilder.method("GET",null);Request request = requestBuilder.build();Call mCall = mOkHttpClient.newCall(request);//异步请求mCall.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_SHORT).show();}@Overridepublic void onResponse(Call call, Response response) throws IOException {Log.d("TestService","MianActivity 线程是:" +Thread.currentThread().getId());if(null != response.cacheResponse()){//如果有缓存String str = response.cacheResponse().toString();}else{//从服务器拿到参数response.body().string();}//切回到主线程runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this,"成功",Toast.LENGTH_SHORT).show();}});}});}
}

另外简单的post请求如下:

//post请求private void post(){mOkHttpClient = new OkHttpClient();RequestBody formBody = new FormBody.Builder().add("user","guian").build();Request request = new Request.Builder().url("http://api.michun.com/usr/personal/list.action").post(formBody).build();Call call = mOkHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {//返回的参数String str = response.body().string();runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(getApplication(),"请求成功",Toast.LENGTH_SHORT).show();}});}});}
get方式一般是从服务器获得参数,post一般是将数据提交给服务器。

GET方式:
1.GET方式是以实体的方式得到由请求URL所指定资源的信息,GET得到的信息是资源。
2.请求的数据会加在URL之后,以?分隔URL和传输数据,多个参数用&连接。URL编码格式采用的是ASCII编码,而不是Unicode,即所有的非ASCII字符都要编码之后再传输。
3.因为URL的长度限制,GET方式传输的数据大小有限制,传送的数据量不超过2KB
4.GET方式传输的参数安全性低,因为传输的数据会显示在请求URL中。

POST方式:
1.用来向目的服务器发出请求,要求它接收被附在请求后的实体,并把它当做请求队列中请求URL所指定资源的附加新子项。
2.POST方式传送的数据量较大,一般默认是没有限制。
3.POST方式将表单内各个字段和内容放置在HTNL HEADER中一起传送到Action属性所指定的URL地址,用户是看不到这个过程的。
4.POST方式传输的数据安全性较高,因为数据传输不是明显显示










推荐阅读
  • 目前正在做毕业设计,一个关于校园服务的app,我会抽取已完成的相关代码写到文章里。一是为了造福这个曾经帮助过我的社区,二是写文章的同时更能巩固相关知识的记忆。一、前言在爬取教务系统 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • keras归一化激活函数dropout
    激活函数:1.softmax函数在多分类中常用的激活函数,是基于逻辑回归的,常用在输出一层,将输出压缩在0~1之间,且保证所有元素和为1,表示输入值属于每个输出值的概率大小2、Si ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了利用AndroidCamera2的照相机api实现实时的图像采集与预览相关的知识,希望对你有一定的参考价值。&n ... [详细]
  • 对okhttp网络请求的简单介绍publicclassAppextendsApplication{OkHttpClient实例是唯一的,所有的请求都会通过 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
author-avatar
温德军46867
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有