博客
关于我
19软件2班 okhttp
阅读量:616 次
发布时间:2019-03-13

本文共 4759 字,大约阅读时间需要 15 分钟。

OkHttp入门与实践

1. 添加OkHttp依赖

在Android项目中引入OkHttp库,是实现网络请求的重要前提。这一步可以通过以下方式完成:

implementation 'com.squareup.okhttp3:okhttp:3.10.0'

2. 占位请求

异步请求实现

private void useAsynGet() {    val okHttpClient = OkHttpClient()    val url = "http://www.qq.com"    val request = Request.Builder().url(url).get().build()    val call = okHttpClient.newCall(request)    call.enqueue(object : Callback {        override fun onFailure(call: Call, e: IOException) {            Log.e("useAsynGet", e.toString())        }        override fun onResponse(call: Call, response: okhttp3.Response): Unit {            val content = response.body().string()            Log.e("useAsynGet", content)            // 在子线程处理,通过Handler发送消息到主线程            val message = Message()            message.what = MSG_WEB_CONTENT            message.obj = content            handler.sendMessage(message)        }    })}

同步请求实现

private void useSyncGet() {    val okHttpClient = OkHttpClient()    val url = "http://www.qq.com"    val request = Request.Builder().url(url).get().build()    val call = okHttpClient.newCall(request)    Thread {        try {            val response = call.execute()            val content = response.body().string()            Log.e("useSyncGet", content)        } catch (e: IOException) {            e.printStackTrace()        }    }.start()}

3. 显示网络内容

为了确保UI更新在主线程 انجام.Foundation历 dequeueReusableCellWithIdentifier(“MSG_WEB_CONTENT”) 来处理消息。

4. OkHttp获取移动电源码

private void useAsynGetMobileCode() {    val okHttpClient = OkHttpClient()    val url = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo"    // 注意:实际使用应根据接口文档调整参数    val request = Request.Builder().url(url).get().build()    val call = okHttpClient.newCall(request)    call.enqueue(object : Callback {        override fun onFailure(call: Call, e: IOException) {            Log.e("useAsynGetMobileCode", e.toString())        }        override fun onResponse(call: Call, response: okhttp3.Response): Unit {            val content = response.body().string()            Log.e("useAsynGetMobileCode", content)            // 通过Handler发送消息到主线程            val message = Message()            message.what = MSG_WEB_CONTENT            message.obj = content            handler.sendMessage(message)        }    })}

5. OkHttp POST 请求

private void useOkhttpPost() {    val url = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo"    // 参数通过FormBodyBuilder构建    val requestBody = FormBody.Builder()        .add("mobileCode", "13456789999")        .add("userID", "")        .build()    val okHttpClient = OkHttpClient()    val request = Request.Builder().url(url).post(requestBody).build()    val call = okHttpClient.newCall(request)    call.enqueue(object : Callback {        override fun onFailure(call: Call, e: IOException) {            Log.e("useOkhttpPost", e.toString())        }        override fun onResponse(call: Call, response: okhttp3.Response): Unit {            val content = response.body().string()            Log.e("useOkhttpPost", content)            // 发送消息到主线程            val message = Message()            message.what = MSG_WEB_CONTENT            message.obj = content            handler.sendMessage(message)        }    })}

6. OkHttp 获取图片

private void useOkhttpGetImage() {    val url = "http://www.gdcp.edu.cn/service?token=5a5d0c3fa9a145719be5b98f7b49eb56"    val okHttpClient = OkHttpClient()    val request = Request.Builder().url(url).get().build()    val call = okHttpClient.newCall(request)    call.enqueue(object : Callback {        override fun onFailure(call: Call, e: IOException) {            Log.e("useOkhttpGetImage", e.toString())        }        override fun onResponse(call: Call, response: okhttp3.Response): Unit {            Log.e("useOkhttpGetImage", response.message())            val inputStream = response.body().byteStream()            val bitmap = BitmapFactory.decodeStream(inputStream)//            {/*此处在子线程处理,需通过Handler发送到主线程*/}            val message = Message()            message.what = MSG_GET_IMG            message.obj = bitmap            handler.sendMessage(message)        }    })}

初始化Handler

private val handler: Handler by lazy {    Handler(object : Handler.Callback {        override fun handleMessage(msg: Message): Boolean {            when (msg.what) {                MSG_WEB_CONTENT -> {                    val content = msg.obj as String                    tv_show.text = content                    return true                }                MSG_GET_IMG -> {                    val bitmap = msg.obj as Bitmap                    iv_show.setImageBitmap(bitmap)                    return true                }            }            return false        }    })}

Handler 替代.Bus

Bus实现了EventBus功能,可以用于消息传递。但在本文中,直接使用Handler更为简便。

转载地址:http://kxqaz.baihongyu.com/

你可能感兴趣的文章
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>
Mysql: 对换(替换)两条记录的同一个字段值
查看>>
mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
查看>>
MYSQL:基础——3N范式的表结构设计
查看>>
MYSQL:基础——触发器
查看>>
Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
查看>>