Android开发之Okhttp是什么
白羽 2018-06-05 来源 :网络 阅读 2412 评论 0

摘要:Android开发之Okhttp是什么,本文将带你了解1、okhttp的功能:2、okhttp的初步使用,希望本文对大家学Android有所帮助。





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("https://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添加点击事件




   

<relativelayout android:layout_height="match_parent" android:layout_width="match_parent" tools:context="com.nova.okhttpdemo.MainActivity" xmlns:android="https://schemas.android.com/apk/res/android" xmlns:app="https://schemas.android.com/apk/res-auto" xmlns:tools="https://schemas.android.com/tools">
 
    <textview android:background="@drawable/bg_text" android:gravity="center" android:id="@+id/text_get" android:layout_centerinparent="true" android:layout_height="40dp" android:layout_width="200dp" android:text="请求网络" android:textcolor="@color/white">
 
</textview></relativelayout>

   


3.编写java代码


   

private void getHttp(){
       //创建OkHttpClient对象
       mOkHttpClient = new OkHttpClient();
       //通过build创建一个rqquest请求
       Request.Builder requestBuilder = new Request.Builder().url("https://www.baidu.com");
       //可以省略 默认是GET请求
       requestBuilder.method("GET",null);
 
       Request request = requestBuilder.build();
       Call mCall = mOkHttpClient.newCall(request);
       //异步请求
       mCall.enqueue(new Callback() {
           @Override
           public void onFailure(Call call, IOException e) {
              Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_SHORT).show();
           }
 
           @Override
           public 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() {
                  @Override
                  public 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;
 
    @Override
    protected 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);
 
    }
 
    @Override
    public 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("https://www.baidu.com");
        //可以省略 默认是GET请求
        requestBuilder.method("GET",null);
 
        Request request = requestBuilder.build();
        Call mCall = mOkHttpClient.newCall(request);
        //异步请求
        mCall.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
               Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_SHORT).show();
            }
 
            @Override
            public 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() {
                   @Override
                   public 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("https://api.michun.com/usr/personal/list.action")
               .post(formBody)
               .build();
 
       Call call = mOkHttpClient.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 str = response.body().string();

 

               runOnUiThread(new Runnable() {

                   @Override

                   public 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方式传输的数据安全性较高,因为数据传输不是明显显示

 


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved