Android之Okhttp初级使用

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添加点击事件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.nova.okhttpdemo.MainActivity">

    <TextView
        android:id="@+id/text_get"
        android:layout_width="200dp"
        android:layout_height="40dp"
        android:text="请求网络"
        android:layout_centerInParent="true"
        android:background="@drawable/bg_text"
        android:gravity="center"
        android:textColor="@color/white"/>

</RelativeLayout>

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() {
            @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("http://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("http://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方式传输的数据安全性较高,因为数据传输不是明显显示




猜你喜欢

转载自blog.csdn.net/qq_33453910/article/details/78675862