博客
关于我
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/

你可能感兴趣的文章
mysql [Err] 1436 - Thread stack overrun: 129464 bytes used of a 286720 byte stack, and 160000 bytes
查看>>
MySQL _ MySQL常用操作
查看>>
MySQL – 导出数据成csv
查看>>
MySQL —— 在CentOS9下安装MySQL
查看>>
MySQL —— 视图
查看>>
mysql 不区分大小写
查看>>
mysql 两列互转
查看>>
MySQL 中开启二进制日志(Binlog)
查看>>
MySQL 中文问题
查看>>
MySQL 中日志的面试题总结
查看>>
mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
查看>>
MySQL 中的外键检查设置:SET FOREIGN_KEY_CHECKS = 1
查看>>
Mysql 中的日期时间字符串查询
查看>>
mysql 中索引的问题
查看>>
MySQL 中锁的面试题总结
查看>>
MySQL 中随机抽样:order by rand limit 的替代方案
查看>>
MySQL 为什么需要两阶段提交?
查看>>
mysql 为某个字段的值加前缀、去掉前缀
查看>>
mysql 主从
查看>>
mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
查看>>