项目中访问网络,请求服务器数据是必不可少的模块,Android中也提供了访问网络的接口,但也有一些优秀的第三方库封装,方便我们使用。
23.1 HttpURLConnection
private fun sendRequestWithHttpURLConnection() {
// 开启线程发起网络请求
thread {
var connection: HttpURLConnection? = null
try {
val response = StringBuilder()
val url = URL("https://juejin.cn/")
connection = url.openConnection() as HttpURLConnection
connection.connectTimeout = 8000
connection.readTimeout = 8000
val input = connection.inputStream
// 下面对获取到的输入流进行读取
val reader = BufferedReader(InputStreamReader(input))
reader.use {
reader.forEachLine {
response.append(it)
}
}
showResponse(response.toString())
} catch (e: Exception) {
e.printStackTrace()
} finally {
connection?.disconnect()
}
}
}
private fun showResponse(response: String) {
runOnUiThread {
viewBinding.responseText.text = response
}
}
当然也需要声明网络权限
<uses-permission android:name="android.permission.INTERNET"/>
可以设置请求方式、参数。注意,每条数据都要以键值对的形式存在,数据与数据之间用“&”符号隔开
connection.requestMethod = "POST"
val output = DataOutputStream(connection.outputStream)
output.writeBytes("username=admin&password=123456")
23.2 OkHttp-优秀的开源网络库
github仓库:github.com/square/okht…
- 引用: 在app模块下的
build.gradle文件中,dependencies中
dependencies {
implementation 'androidx.core:core-ktx:1.8.0'
...
// okhttp
implementation 'com.squareup.okhttp3:okhttp:4.1.0'
implementation 'com.orhanobut:logger:2.2.0'
}
添加后点击Sync Now,然后可以在Android Studio底部工具栏Build中查看是否成功
- 使用:可参考官方说明
private fun useOkHttpGet() {
val client = OkHttpClient()
// 默认get请求
val request = Request.Builder()
.url("https://www.baidu.com")
.build()
val response = client.newCall(request).execute()
val responseData = response.body?.string()
}
// Post请求
private fun useOkHttpPost() {
val client = OkHttpClient()
val requestBody = FormBody.Builder()
.add("key1", "value1")
.add("key2", "value2")
.build()
val request = Request.Builder()
.url("https://www.baidu.com")
.post(requestBody)
.build()
val response = client.newCall(request).execute()
val responseData = response.body?.string()
}
23.3 网络请求回调的实现方式
object HttpUtil {
// okHttp请求封装
fun sendOkHttpRequest(address: String, callback: okhttp3.Callback) {
val client = OkHttpClient()
val request = Request.Builder()
.url(address)
.build()
client.newCall(request).enqueue(callback)
}
}
// 使用
private fun useOKHttpUtil() {
val address = "https://www.baidu.com"
HttpUtil.sendOkHttpRequest(address, object : Callback {
override fun onResponse(call: Call, response: Response) {
// 得到服务器返回的具体内容
val responseData = response.body?.string()
}
override fun onFailure(call: Call, e: IOException) {
// 在这里处理异常
}
})
}
这只是网络的简单封装,应该在此基础上统一封装处理成功、失败情况,统一处理后,再回调。