Android开发-网络请求框架okhttp3的使用

1OkHttp3简介: 

OkHttp3是一个当前应用非常广泛的网络请求的开源框架。具有如下特点:

1)支持http2,对一台机器的所有请求共享同一个socket
2)内置连接池,支持连接复用,减少延迟
3)支持透明的gzip压缩响应体
4)通过缓存避免重复的请求
5)请求失败时自动重试主机的其他ip,自动重定向
6)好用的API

2OkHttp3基本功能:

作为一个完善的网络请求框架,Okhttp3具有如下功能:

(1) PUT,DELETE,POST,GET等请求
(2) 文件的上传下载
(3) 加载图片(内部会图片大小自动压缩)
(4) 支持请求回调,直接返回对象、对象集合
(5) 支持session的保持

3OkHttp3使用方式:

(1)添加依赖,申请权限

在build.gradle文件中,

    implementation 'com.squareup.okhttp3:okhttp:3.4.1'
    implementation 'com.squareup.okio:okio:1.7.0'

 在清单文件中,加入权限申请:

    <uses-permission android:name="android.permission.INTERNET" />

(2)使用步骤:

(1)创建OkHttpClient对象
(2)通过Builder模式创建Request对象,参数必须有个url参数,可以通过Request.Builder设置更多的参数比如:header、method等
(3)通过request的对象去构造得到一个Call对象,Call对象有execute()和cancel()等方法。
(4)以异步的方式去执行请求,调用的是call.enqueue,将call加入调度队列,任务执行完成会在Callback中得到结果。
 

4 OkHttp代码举例:

请求http和图片文件举例:

布局文件main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/hello_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:maxLength="500"
        />
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Used Sdk Test!"
        />
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Web Test!"
        />



    <ImageView
        android:layout_width="160dp"
        android:layout_height="200dp"
        android:id="@+id/imageview1"
        >


    </ImageView>

</LinearLayout>

说明:

(1)android:maxLength="500" :设置最大文本长度为500个字符;

(2)设置ImageView的大小为:160x200 

Java文件MainMainActivity:

public class MainMainActivity extends AppCompatActivity {

    private final static String TAG = "MainMainActivity";

    private Context mContext;
    private TextView mResTextView;
    private ImageView mImageView;
    private Button mButton, mBtn2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = this;

        initView();
        String strUrl = "https://www.baidu.com";
        OkhttpRequesturl(strUrl,1);

        String imgUrl = "https://www.sina.com.cn//i3.sinaimg.cn/home/2013/0331/U586P30DT20130331093840.png";
        OkhttpRequesturl(imgUrl,2);

    }

    private void initView() {
        mImageView = findViewById(R.id.imageview1);
        mResTextView = findViewById(R.id.hello_textview);
    }
   
    /1. handler,用于更新UI///
    private static final int Handler_Msg_Http_Str_Success = 1001;
    private static final int Handler_Msg_Http_Img_Success = 1002;
    private static final int Handler_Msg_Http_Fail = 1009;
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                //在Handler中更新UI
                case Handler_Msg_Http_Img_Success:
                    byte[] imgBytes = (byte[]) msg.obj;
                    //创建bitmap对象
                    Bitmap bitmap = BitmapFactory.decodeByteArray(imgBytes, 0, imgBytes.length);
                    //设置图片
                    mImageView.setImageBitmap(bitmap);
                    break;
                case Handler_Msg_Http_Str_Success:
                    String dataStr = (String)msg.obj;
                    Log.i(TAG, "dataStr=" + dataStr);
                    mResTextView.setText(dataStr);
                //当加载网络失败执行的逻辑代码
                case Handler_Msg_Http_Fail:
                    Toast.makeText(MainMainActivity.this, "网络请求失败!", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };

    2. okhttp test//
    public void OkhttpRequesturl(String urlstr,int type) {

        Request.Builder builder = new Request.Builder();
        Request request = builder.url(urlstr).method("GET",null).build();
        OkhttpExecCall(request,type);
    }

    /**
     *
     * @param request
     * @param type: 1:URL是普通字符串http请求;2:url是图片请求
     */
    private void OkhttpExecCall(Request request, final int type) {
        String str = request.toString();
        Log.i(TAG, "[execCall]str=000==" + str);

        OkHttpClient httpClient = new OkHttpClient();
        Call call = httpClient.newCall(request);

        //4.加入队列,重写回调方法
        call.enqueue(new Callback() {
            //失败
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                Message message = handler.obtainMessage();
                message.what = Handler_Msg_Http_Fail;
                handler.sendMessage(message);
            }
            //成功
            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                if (type == 1) {
                    String dataStr = response.body().string();
                    Message message = handler.obtainMessage();
                    message.obj = dataStr;
                    message.what = Handler_Msg_Http_Str_Success;
                    message.arg1 = type;
                    handler.sendMessage(message);

                }else if (type == 2) {
                    byte[] imgBytes = response.body().bytes();
                    Message message = handler.obtainMessage();
                    message.obj = imgBytes;
                    message.arg1 = type;
                    message.what = Handler_Msg_Http_Img_Success;
                    handler.sendMessage(message);
                }
            }
        });

    }
}

 说明:

(1)Handler: 用于更新UI。Okhttp异步请求时,需要在callback中进行message的发送,将网络请求的返回数据发送到Ui线程,UI线程去更新UI;

(2)OkhttpExecCall:对OkHttpClient进行简单的封装,可以区别出是普通的http请求,还是图片请求;

(3)call.enqueue(new Callback() {...}:将请求加入到队列中,在Callback回调函数中,进行网络请求结果的处理;

(4)byte[] imgBytes = response.body().bytes();网络请求返回图片时,可以将图片信息保存在byte[]数组中。

运行结果:

在UI界面上,显示出请求返回的字符串,并且显示一张图片。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值