成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

選Retrofit還是Ktor?手把手教你做決定

開發 項目管理
每次新建Android項目,選網絡庫就像在奶茶店點單——Retrofit是經典珍珠奶茶穩中求勝,Ktor是新出的芝士葡萄鮮果茶讓人躍躍欲試。

每次新建Android項目,選網絡庫就像在奶茶店點單——Retrofit是經典珍珠奶茶穩中求勝,Ktor是新出的芝士葡萄鮮果茶讓人躍躍欲試。

  • 當你急著對接API時,哪個能三分鐘搞定?
  • 當產品經理突發奇想要加WebSocket時,哪個能優雅接招?
  • 當老板說要搞跨平臺開發時,哪個能讓你少掉頭發?

舉個栗子

Retrofit基礎用法

// 1. 定義接口(就像點菜單)
interface NewsApiService {
    @GET("news/latest")
    suspendfun getLatestNews(): Response<List<News>>
}

// 2. 創建Retrofit實例(配菜過程)
val retrofit = Retrofit.Builder()
    .baseUrl("https://api.rairmmd.com/")
    .addConverterFactory(GsonConverterFactory.create()) // 自動把JSON變成對象
    .client(OkHttpClient.Builder().addInterceptor(HttpLoggingInterceptor()).build())
    .build()

// 3. 開始點菜!
val service = retrofit.create(NewsApiService::class.java)
val newsList = service.getLatestNews().body() // 直接拿到新聞列表對象

適合場景:快速對接標準REST API

Ktor簡單配置

// 1. 創建客戶端(搭積木式配置)
val httpClient = HttpClient(CIO) {
    install(ContentNegotiation) {
        json(Json {
            ignoreUnknownKeys = true// JSON多了字段也不報錯
        })
    }
    install(Logging) {
        logger = Logger.DEFAULT
        level = LogLevel.HEADERS // 想看請求頭就調這個
    }
}

// 2. 發起請求(像發微信一樣簡單)
suspendfun fetchNews(): List<News> {
    return httpClient.get("https://api.rairmmd.com/news/latest").body()
}

// 3. 高級玩法:動態URL參數
val searchResults = httpClient.get {
    url("https://api.rairmmd.com/search")
    parameter("q", "熱門") // 自動拼接到URL
    parameter("page", 2)
}.body<List<Article>>()

亮點功能:想加什么功能就像裝插件,比如給請求自動加Token:

HttpClient {
    install(Auth) {
        bearer {
            loadTokens { 
                BearerTokens("token", "1122334455667788") 
            }
        }
    }
}

實例對比

案例1:新聞列表接口(Retrofit版)

// 接口定義
@GET("newsList")
suspendfun getNewsListByCategory(
    @Query("category") category: String,
    @Query("page") page: Int
): Response<NewsResponse>

// 使用方式
viewModelScope.launch {
    try {
        val response = newsService.getNewsListByCategory("熱門", 1)
        if (response.isSuccessful) {
            _newsList.value = response.body()?.data ?: emptyList()
        }
    } catch (e: Exception) {
        // 處理異常
    }
}

案例2:同一個功能(Ktor版)

suspend fun loadNewsList(category: String, page: Int) {
    val result = httpClient.get {
        url("https://api.rairmmd.com/newsList")
        parameters {
            append("category", category)
            append("page", page.toString())
        }
    }
    
    if (result.status == HttpStatusCode.OK) {
        val newsData = result.body<NewsResponse>()
        _newsList.value = newsData.data
    }
}

選擇困難癥急救包

當你需要...

  • 快速上線 → Retrofit(老司機踩油門)
// 三行代碼搞定基礎配置
Retrofit.Builder()
    .baseUrl("https://api.rairmmd.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build()
  • 魔改請求 → Ktor(樂高式組裝)
// 自定義超時時間+重試機制
HttpClient(CIO) {
    install(HttpTimeout) {
        requestTimeoutMillis = 15000
    }
    install(HttpRequestRetry) {
        maxRetries = 3
        retryOnExceptionIf { _, cause -> 
            cause is ConnectTimeoutException 
        }
    }
}
  • 跨平臺開發 → Ktor(一份代碼走天下)
// 共享common模塊中的網絡請求代碼
expect fun createHttpClient(): HttpClient

// iOS版實現
actual fun createHttpClient() = HttpClient(CIO) { /* iOS配置 */ }

// Android版實現
actual fun createHttpClient() = HttpClient(Android) { /* Android配置 */ }

過來人的忠告

Retrofit踩坑記錄

// 坑1:忘記加轉換器會直接崩潰!
Retrofit.Builder()
    .baseUrl("https://api.rairmmd.com/")
    // 漏了.addConverterFactory()
    .build()

// 坑2:路徑參數要用@Path標注
@GET("user/{id}/profile") // ? 正確姿勢
suspend fun getUserProfile(@Path("id") userId: String)

Ktor避雷指南

// 雷區1:協程作用域沒管理好
// 錯誤示范 ?
fun loadData() {
    GlobalScope.launch { 
        httpClient.get(...) // 可能導致內存泄漏
    }
}

// 正確姿勢 ?
viewModelScope.launch {
    httpClient.get(...)
}

// 雷區2:響應解析類型不匹配
val news = httpClient.get("...").body<News>() // News類字段要和JSON完全對應

終極選擇器

需求

Retrofit

Ktor

要對接10個API且今晚就要上線

?? 穩如老狗

?? 現學來不及

要做直播間的彈幕推送

?? 輪詢費勁

?? 長連接神器

老板說要"技術前沿"

?? 經典款

?? 新潮之選

團隊全是Java老手

???? 無縫銜接

?? 語法震驚

想做小程序+APP+網頁三端通吃

? 各玩各的

?? 跨平臺大法

小項目隨便選,大項目看團隊。實在糾結?

責任編輯:武曉燕 來源: 沐雨花飛碟
相關推薦

2017-05-18 12:45:35

數據分析數據理解數據

2015-07-29 16:33:12

IOS半透明引導

2020-07-23 14:39:28

系統權限設計

2021-07-14 09:00:00

JavaFX開發應用

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機

2025-05-07 00:31:30

2021-04-06 22:48:41

數據集工具Python

2011-03-28 16:14:38

jQuery

2023-04-26 12:46:43

DockerSpringKubernetes

2022-01-08 20:04:20

攔截系統調用

2022-12-07 08:42:35

2022-03-14 14:47:21

HarmonyOS操作系統鴻蒙

2022-07-27 08:16:22

搜索引擎Lucene

2011-02-22 13:46:27

微軟SQL.NET

2021-02-26 11:54:38

MyBatis 插件接口

2021-12-28 08:38:26

Linux 中斷喚醒系統Linux 系統

2021-10-03 20:26:56

系統模塊標簽

2020-10-13 11:21:57

框架自動化開發

2024-03-05 18:27:43

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久人人爽人人爽人人片av免费 | 欧美一区2区三区4区公司二百 | 国产成人精品一区二区三区在线 | 91精品国产乱码久久久久久久久 | 天天干天天想 | aaaaaaa片毛片免费观看 | 在线看片国产精品 | 99久久久国产精品免费消防器 | 成人精品一区亚洲午夜久久久 | 精品久久一区 | 亚洲精品一区在线观看 | 午夜视频在线免费观看 | 久久精品国产免费看久久精品 | 国产一区二区三区高清 | 国产美女精品 | 国产视频一区二区 | 免费久久精品视频 | 在线视频91 | 亚洲一区二区三区免费在线观看 | 久久99精品久久久久久国产越南 | 婷婷福利| 日韩精品成人免费观看视频 | 天堂中文在线播放 | 亚洲成av人片在线观看 | 九九久久久 | 国产欧美精品在线观看 | 亚洲精品一区二区二区 | 久久久久国产一区二区 | 全部免费毛片在线播放网站 | 亚洲中字在线 | 亚洲手机视频在线 | 欧美日韩视频 | 成人看片在线观看 | 在线免费观看黄视频 | 日韩欧美国产一区二区三区 | 精品少妇一区二区三区日产乱码 | 成人影院av | av免费网站在线观看 | 久久精品一区二区三区四区 | 日本不卡一区 | 国产激情在线 |