Android中有很多的第三方控件,其中OkHttp是一个很强大的用于网络加载的第三方框架,当然了,它的内部也是使用原生的代码封装好的。今天我们就来看一下OkHttp的简单用法:

  说到网络请求,肯定就分get和post两种了,这里我们说一下get和post的简单实用:

  首先我们需要先在我们的项目中引入OkHttp的依赖,在你的项目的gradle下面的dependencies下添加依赖:

 

 compile 'com.squareup.okhttp3:okhttp:3.4.1'

  然后同步项目,会自动下载OkHttp相关的依赖。或者也可以这样,选中此工作空间的设置:

----》选中你要添加依赖(要使用OkHttp)的项目,选择添加类库依赖

在搜索框中输入你想要下载的第三方框架,点搜索哪个按钮,选中想要下载的,点击OK,完成。

  1. Get方式:我们先看一段代码:

     private void httpget() {
    //okhttpclient :okthttp主要类
    OkHttpClient client=new OkHttpClient();
    /*
    Request:请求服务端
    Request.Builder():设计模式:将一个复杂的对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示,他的每一个属性的设置都返回一个builder对象,也就是说可以一直使用.XX的形式为其设置属性
    build:结束,返回Request对象
    */
    Request request=new Request.Builder().url(path).build();
    //Call 将你的请求封装成任务
    Call call=client.newCall(request);
    //请求调度
    call.enqueue(new Callback() {
    //失败
    @Override
    public void onFailure(Call call, IOException e) { }
    //成功
    @Override
    public void onResponse(Call call, Response response) throws IOException {
    //返回String
    String json=response.body().string();
    Log.i("TAG","----->get"+json);
    //返回byte[]
    response.body().bytes();
    //返回流
    response.body().byteStream();
    }
    });
    }

      如上所示,我们要使用OkHttp的时候,首先要先new一个OkHttpClient对象,OkHttpClient是其一个主要的类,Response对象用来构建我们需要额外传递的值(如head,method等)和一些其他需要设置的参数,而Call对象是用来封装任务并执行调度的。我们调用call.enqueue()方法,将call加入调度队列,在enqueue()方法中我们通过匿名内部类的形式实现这个CallBack接口,并实现其中的两个方法,onFailure()方法是请求网络失败的时候会执行的方法,onResponse()是请求成功的时候会执行的方法。我们主要看onResponse()方法,可以看到,我们在onResponse()方法中通过回传的Response对象得到我们想要的网络请求的数据。通过response.body()方法我们能得到ResponseBody对象,在这个对象中我们可以通过方法获得到字符串、字节数组和输入流。也就是说这个地方是支持大文件下载的。不过也说明了onResponse()方法不是在主线程中执行的,同样的,onFailure()方法也是在子线程中执行,只要我们调用了enqueue(),OkHttp会为我们开启一个子线程。我们可以通过使用handler来实现UI更新。当然,我们也可以像这样通过call.excute()方法直接返回一个Response()对象:

     OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder().url(path).build();
    try {
    Response res = client.newCall(request).execute();
    Log.d("tag", "onResponse: "+res.body().string());
    } catch (IOException e) {
    e.printStackTrace();
    }
  2. Post方式:
     private void httppost() {
    //okhttpclient :okthttp主要类
    OkHttpClient client=new OkHttpClient();
    /*
    RequestBody:请求体,携带参数去服务端访问
    FormBody:设置表单参数,用它来设置要携带的参数
    FormBody.Builder():设计模式:将一个复杂的对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
    build:结束,返回一个RequestBody
    */
    RequestBody body=new FormBody.Builder().add("name","xiaoming").add("age","18").build();
    //创建Request
    Request request=new Request.Builder().url(path).post(body).build();
    //Call 将你的请求封装成任务
    Call call=client.newCall(request);
    //请求调度
    call.enqueue(new Callback() {
    //失败
    @Override
    public void onFailure(Call call, IOException e) { }
    //成功
    @Override
    public void onResponse(Call call, Response response) throws IOException {
    String json= response.body().string();
    Log.i("TAG","----->post"+json); response.body().byteStream();
    response.body().bytes();
    }
    });
    }

    get方式请求如果熟悉了,post其实与它一样,只是在构建的时候需要多传递几个参数而已。可以看到,我们在上面构建Request对象的时候先构建了一个RequestBody对象,有代码可见,RequestBody对象也是一个Builder设计模式,设置完参数后不要忘了调用其build()方法完成构建。在封装Request对象的时候有点不同:

      Request request=new Request.Builder().url(path).post(body).build();

      可以看到我们在设置了其url属性后又调用了post,并将刚才构建的RequestBody()对象传递进去。这说明我们使用的post方式。下面的请求调度方法与get相同,不再赘述。

  可以看到,网络访问的代码还是不少的,如果每次网络访问我们都要写这么多的代码的话,那可毁了,所以我们下面去封装一个工具类,这里以get方式为例:

 package ggcomic.rabbit.lx.ggcomic.utils;

 import java.io.IOException;

 import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response; /**
* OkHttp网络加载(单例模式)
* Created by Lx on 2016/9/12.
*/
public class OkHttpUtils {
public OkHttpUtils() {
} public static OkHttpUtils okHttpUtils = new OkHttpUtils(); public static OkHttpUtils getInstance() {
return okHttpUtils;
} OkHttpClient client = new OkHttpClient(); /**
* 官方
* 直接得到string字符串
* @param path
* @return
* @throws IOException
*/
public String run(String path) throws IOException {
Request request = new Request.Builder().url(path).build();
//官方封装的方法,没有请求调度,在使用该工具类的时候要启动一个线程,
// 使用client.newCall(request).enqueue(new CallBack(){...})的时候不需要启动线程
Response response = client.newCall(request).execute();
return response.body().string();
} /**
* 非官方
* 获得call实例
* @param path
* @return
*/
public Call getCallInstance(String path) {
Request request = new Request.Builder().url(path).build();
Call call = client.newCall(request);
return call;
} }

这里我们使用了单例模式的饿汉式写法。这里工具类的写法有两种,一种是官方的,一种是非官方的,看代码可以知道,官方封装的方法无法处理请求失败时的操作,因为它直接返回给我们一个Response对象,而非官方的是我自己的写法,这里返回一个Call对象,我们在代码中使用非官方的写法:

 OkHttpUtils.getInstance().getCallInstance(String url).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
//网络连接失败时的操作
}
});
} @Override
public void onResponse(Call call, Response response) throws IOException {
//网络连接成功时的操作
}
});

我们先是调用getInstance()方法得到一个OkHttp实例,然后再调用其中的方法,在里面完成相应的操作即可。

到这里OkHttp的简单的使用就结束了,其实算算没有多少代码,还是比较简单的对吧~如果想要深入的了解OkHttp,请移文鸿洋大神的这篇博客:

Android OkHttp完全解析 是时候来了解OkHttp了

写的特别的全面。

Android--第三方控件--okHttp的更多相关文章

  1. Android 开源控件与常用开发框架开发工具类

    Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...

  2. android课程表控件、悬浮窗、Todo应用、MVP框架、Kotlin完整项目源码

    Android精选源码 Android游戏2048 MVP Kotlin项目(RxJava+Rerotfit+OkHttp+Glide) Android基于自定义Span的富文本编辑器 android ...

  3. 好用的第三方控件,Xcode插件(不断更新)

    第三方控件类:   1.提示框 MBProgressHUD: 是一款非常强大的.提供多种样式的提示框.使用起来简单.方便.可以在GitHub上查看具体的使用方法. https://github.com ...

  4. android 基础控件(EditView、SeekBar等)的属性及使用方法

        android提供了大量的UI控件,本文将介绍TextView.ImageView.Button.EditView.ProgressBar.SeekBar.ScrollView.WebView ...

  5. Delphi7 第三方控件1stClass4000的TfcImageBtn按钮控件动态加载jpg图片例子

    Delphi7 第三方控件1stClass4000的TfcImageBtn按钮控件动态加载jpg图片例子 procedure TForm1.Button1Click(Sender: TObject); ...

  6. Android基本控件之Menus

    在我们的手机中有很多样式的菜单,比如:我们的短信界面,每条短信,我们长按都会出现一个菜单,还有很多的种类.那么现在,我们就来详细的讨论一下安卓中的菜单 Android的控件中就有这么一个,叫做Menu ...

  7. Android:控件布局(相对布局)RelativeLayout

    RelativeLayout是相对布局控件:以控件之间相对位置或相对父容器位置进行排列. 相对布局常用属性: 子类控件相对子类控件:值是另外一个控件的id android:layout_above-- ...

  8. Android:控件布局(线性布局)LinearLayout

    LinearLayout是线性布局控件:要么横向排布,要么竖向排布 决定性属性:必须有的! android:orientation:vertical (垂直方向) .horizontal(水平方向) ...

  9. delphi使用 第三方控件

    第三方控件安装时必须把所有的pas,dcu,dpk,res等文件复制到你的Lib目录下 然后通过dpk进行安装 安装后会多出来新的控件面板,新控件就在那里了 当然也有一些控件会安装到原有的面板上 比如 ...

随机推荐

  1. 【BZOJ2090/2089】[Poi2010]Monotonicity 2 动态规划+线段树

    [BZOJ2090/2089][Poi2010]Monotonicity Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k].选出一个长度 ...

  2. NET Framework 4.5新特性 (二) 控制台支持 Unicode (UTF-16) 编码

    从 .NET Framework 4.5 开始,Console 类支持与 UnicodeEncoding 类的 UTF-16 编码.  显示 Unicode 字符到控制台,你可以设置 OutputEn ...

  3. 第5章 IDA Pro实验题

    Question: 1.DLLMain的地址是什么? 2.使用import窗口并浏览到gethostbyname,导入函数定位到什么位置 3.有多少函数调用了gethostbyname? 4.将精力放 ...

  4. Pandas 删除指定列中为NaN的行

    定位要删除的行 需求:删除指定列中NaN所在行. 如下图,’open‘ 列中有一行为NaN,定位到它,然后删除. 定位: df[np.isnan(df['open'])].index # 这样即可定位 ...

  5. Selenium定位不到指定元素原因之iframe(unable to locate element)

    浏览过程中,图片中的内容可能太小,无法看清,可以>右键>在新标签中打开 Outline 项目原因,需要用selenium实现模拟登陆.模拟上传文件,自然就需要模拟点击[上传]按钮: 模拟点 ...

  6. Thinkphp的list_to_tree 实现无限级分类列出全部节点

    list_to_tree 使用起来十分方便,具体可查看手冊.由于我在用的时候须要同一时候列出全部节点,所以写了一个递归函数,拿出来供大家參考. public function index(){ Loa ...

  7. DL for objection detection

    在计算机视觉领域,"目标检测"主要解决两个问题:图像上多个目标物在哪里(位置),是什么(类别).围绕这个问题,人们一般把其发展历程分为3个阶段:1. 传统的目标检测方法2. 以R- ...

  8. Hadoop的IO操作

    Hadoop的API官网:http://hadoop.apache.org/common/docs/current/api/index.html   相关的包 org.apache.hadoop.io ...

  9. 吴超老师课程--Pig的介绍和安装

    1.Pig是基于hadoop的一个数据处理的框架.  MapReduce是使用java进行开发的,Pig有一套自己的数据处理语言,Pig的数据处理过程要转化为MR来运行. 2.Pig的数据处理语言是数 ...

  10. Appium做Android功能自动化测试

    前言 做Android端功能自动化已有2年多的时间了,使用过的功能自动化框架有Robotium.Uiautomator.Appium.最近研究自动化case复用的方案,调研了Appium的自动化框架, ...