簡(jiǎn)介
在 Android 開(kāi)發(fā)中,網(wǎng)絡(luò)請(qǐng)求是一個(gè)極為關(guān)鍵的部分。Retrofit 作為一個(gè)強(qiáng)大的網(wǎng)絡(luò)請(qǐng)求庫(kù),能夠簡(jiǎn)化開(kāi)發(fā)流程,提供高效的網(wǎng)絡(luò)請(qǐng)求能力。
Retrofit 是一個(gè)建立在 OkHttp 基礎(chǔ)之上的網(wǎng)絡(luò)請(qǐng)求庫(kù),能夠?qū)⑽覀兌x的 Java 接口轉(zhuǎn)化為相應(yīng)的 HTTP請(qǐng)求,Retrofit 是適用于 Android 和 Java 的類型安全 HTTP 客戶端。通過(guò)Retrofit,我們可以輕松發(fā)起網(wǎng)絡(luò)請(qǐng)求,還能將服務(wù)器返回的數(shù)據(jù)轉(zhuǎn)換為所需的格式,如 JSON。
簡(jiǎn)單使用
1. 在 APP 目錄下的 build.gradle 里添加依賴
// retrofit
// https://github.com/square/retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
// 使用 gson 解析 json
// https://github.com/google/gson
implementation 'com.google.code.gson:gson:2.9.0'
// 適配 retrofit 使用 gson 解析
// 版本要和 retrofit 一樣
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
2. 在 AndroidManifest.xml 里添加網(wǎng)絡(luò)權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>
3. NetworkModule.kt 創(chuàng)建 Retrofit 實(shí)例
object NetworkModule {
/**
* TODO 創(chuàng)建 Retrofit 實(shí)例
*/
fun createRetrofit(okHttpClient: OkHttpClient) : Retrofit{
// 返回一個(gè) retrofit 實(shí)例
return Retrofit.Builder()
.client(okHttpClient) // 讓 retrofit 使用 okhttp
.baseUrl("http://v.juhe.cn/") // api 地址
.addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))// 使用 gson 解析 json
.build()
}
/**
* TODO 創(chuàng)建 OkHttpClient 實(shí)例
*/
fun createOkHttpClient() : OkHttpClient{
// 返回一個(gè) OkHttpClient 實(shí)例
return OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)// 設(shè)置連接超時(shí)時(shí)間
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.build()
}
}
4. NetworkService.kt?創(chuàng)建網(wǎng)絡(luò)請(qǐng)求的 Service。是一個(gè)接口類
interface NetworkService {
@GET("toutiao/index")
suspend fun getNewsService(
@Query(value = "key") key : String
) : NewsEntity
/**
* TODO 通過(guò) Retrofit 創(chuàng)建一個(gè) NetworkService 實(shí)例
*/
companion object{
fun createService() : NetworkService {
return NetworkModule.createRetrofit(NetworkModule.createOkHttpClient())
.create(NetworkService::class.java) // TODO 返回一個(gè) NetworkService 的實(shí)例
}
}
}
NewsEntity 是一個(gè)實(shí)體類,解析返回的數(shù)據(jù)。Result.kt 是一個(gè)具體的數(shù)據(jù)類,可根據(jù)返回的數(shù)據(jù)進(jìn)行細(xì)化。
class NewsEntity {
var reason : String? = null //返回說(shuō)明
//var result : Result? = null // 返回結(jié)果
var error_code : Int = 0 // 返回碼
}
5. MainActivity.kt 進(jìn)行網(wǎng)絡(luò)請(qǐng)求
class MainActivity : AppCompatActivity() {
private lateinit var networkRequest : TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
networkRequest = findViewById(R.id.network_request)
// TODO 點(diǎn)擊發(fā)送網(wǎng)絡(luò)請(qǐng)求
networkRequest.setOnClickListener{
// TODO 網(wǎng)絡(luò)請(qǐng)求為耗時(shí)操作,放到協(xié)程作用域里進(jìn)行
lifecycleScope.launch {
val networkService = NetworkService.createService()
val newsEntity = networkService.getNewsService("40279bee66d427555ce361fe49387a8e")
Log.d("HL", newsEntity.reason.toString())
}
}
}
}
網(wǎng)絡(luò)請(qǐng)求是異步操作,需要在協(xié)程里進(jìn)行。這里使用 lifecycleScope.launch{ ...} 進(jìn)行。使用 Lifecycle 添加如下依賴。
implementation ("androidx.lifecycle:lifecycle-livedata-ktx:2.6.1")
請(qǐng)求的數(shù)據(jù)是聚合數(shù)據(jù)上的新聞?lì)^條API 接口,請(qǐng)求地址為:?"http://v.juhe.cn/toutiao/index?key=40279bee66d427555ce361fe49387a8e"。由于是使用的 http 請(qǐng)求頭,所以需要在 AndroidManifest.xml 里添加 android:usesCleartextTraffic="true",更改網(wǎng)絡(luò)安全配置。
最后,通過(guò)打印 Log 的方式,查看請(qǐng)求是否成功。
Log.d("HL", newsEntity.reason.toString())
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-829043.html
對(duì)應(yīng)的 Java 版本實(shí)現(xiàn):Android---Retrofit實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求:Java 版?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-829043.html
到了這里,關(guān)于Android---Retrofit實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求:Kotlin版的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!