Android网络请求|青训营笔记

176 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第14天。

Android程序几乎无时无刻都在和网络资源打交道。那么,Android是如何进行网络请求的呢?让我来学习Android网络请求两个常见的开源框架:OkHttpRetrofit

OkHttp

什么是OkHttp

OkHttp一个处理网络请求的开源项目,是安卓端流行的轻量级框架,由移动支付Square公司贡献。

配置文件

在build.gradle文件中编写:

    implementation("com.squareup.okhttp3:okhttp:4.9.1")

重新build项目,导入第三方库。

创建Get请求

    private fun asyncGet() {
        val url = ""
        //创建request请求对象
        val request = Request.Builder()
            //请求路径
            .url(url)
            //设置get请求方式和请求参数
            .method("GET", null)
            .build()
 
        //创建call并调用enqueue()方法实现网络请求
        OkHttpClient().newCall(request)
            .enqueue(object : Callback {
                //请求失败回调函数
                override fun onFailure(call: Call, e: IOException) {
                }
                //请求成功回调函数
                override fun onResponse(call: Call, response: Response) {
                }
            })
    }

使用enqueue方法发起异步网络请求。

创建Post请求

    private fun asyncPost() {
        val url = ""
        //添加post请求参数
        val requestBody = FormBody.Builder()
            .add("userName", "name")
            .add("passWord", "pass")
            .build()
 
        //创建request请求对象
        val request = Request.Builder()
            .url(url)
            .post(requestBody)
            .build()
 
        //创建call并调用enqueue()方法实现网络请求
        OkHttpClient().newCall(request)
            .enqueue(object : Callback {
                override fun onFailure(call: Call, e: IOException) {
                }
                override fun onResponse(call: Call, response: Response) {
                }
            })
    }

使用FormBody.Builder方法定义请求体,在创建request请求对象时可以直接使用post方法,参数为请求体。

设置超时时间和缓存

在大多数情况下,网络请求都为耗时操作,主程序不能一直等待网络请求。我们可以通过配置okHttpClient对象属性来设置超时时间和缓存。

    private fun setTimeoutAndCache() {
        //缓存目录
        val cacheDir=externalCacheDir
        //缓存大小
        val cacheSize=10*1024*1024L
        val okHttpClientBuilder=OkHttpClient.Builder()
            .connectTimeout(20,TimeUnit.SECONDS)
            .readTimeout(20,TimeUnit.SECONDS)
            .writeTimeout(20,TimeUnit.SECONDS)
            .cache(Cache(File(cacheDir,"cache.txt"),cacheSize))
        val okHttpClient=okHttpClientBuilder.build()
    }

Retrofit

什么是Retrofit

Retrofit和okHttp同属于一个公司研发,是对OkHttp的一个封装,具备OkHttp的优点,同时拥有更多的特性:

  • restful api设计风格。
  • 可以通过注解配置请求,包括请求方法,请求参数,返回值等。
  • 使用Converter可以将获得的数据解析为不同形式的数据。

添加依赖

同样需要在module文件中导入:

dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'//可选依赖,解析json字符所用
implementation 'com.squareup.retrofit2:converter-scalars:2.0.0' //解析字符串
}

创建描述网络请求接口

//接口类名:可自定义,尽量和这类请求的含义相关
interface IUserInfoService {

    @GET("users/{uid}/name")
    fun getUserName(@Path("uid") uid: Int): Call<ResponseBody>

    //@GET("users/{name}/uid")
    //fun getRequest(@Path("name") name:String)) Call<User>
    
    //后续可以增加其他的接口,一个接口对应一个api请求
}
  • @GET注解:说明请求方式并指定访问请求路径
  • @Path注解:指定传进来参数的属性,该属性值会替换@GET注解中的路径

发起网络请求

fun getUserName(view: View) {
    //创建Retrofit实例
    val retrofit = Retrofit.Builder()
        .baseUrl("https://www.bytedance.com/")
        .build()
    //创建iUserInfoService实例
    val iUserInfoService = retrofit.create(IUserInfoService::class.java)
    //创建网络请求Call对象
    val call = iUserInfoService.getUserName(1123)
    //发起异步请求
    call.enqueue(object : Callback<ResponseBody> {
        override fun onResponse(call: Call<ResponseBody>,
                                response: Response<ResponseBody>) {
            //请求成功时回调
            request_result_tv.text = "请求成功:" + response.body()!!.string()
        }
        override fun onFailure(call: Call<ResponseBody>, e: Throwable) {
            //请求失败时候的回调
            request_result_tv.text = "请求失败:" + e.message
        }
    })
}

总结

Retrofit和OkHttp的组件是当下Android开发最为流行的网络请求方式,它们的功能更为全面,且使用方便。当然也有其他的一些框架,主要是看业务需要选择使用什么。

参考