Android學習總結之Retrofit篇

1. 注解原理概述

在 Java 里,注解是一種元數據,它為代碼提供額外信息但不影響程序的實際邏輯。注解可以在類、方法、字段等元素上使用,并且能在編譯時、運行時通過反射機制被讀取。Retrofit 充分利用了 Java 注解機制,通過自定義注解來描述網絡請求的各種信息,像請求方法、URL、請求參數等。

2. Retrofit 工作流程結合注解原理詳細分析

步驟 1:定義網絡請求接口并使用注解

開發者需要定義一個包含網絡請求方法的接口,并且使用 Retrofit 提供的注解來描述每個請求的具體信息。

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;
import java.util.List;// 定義一個接口,用于獲取用戶的倉庫列表
public interface GitHubService {// 使用 @GET 注解指定請求方法為 GET// "users/{user}/repos" 是請求的相對 URL,{user} 是一個路徑參數@GET("users/{user}/repos")Call<List<Repo>> listRepos(@Path("user") String user);
}
  • 注解解釋
    • @GET:表明這是一個 GET 請求,Retrofit 會依據這個注解構建相應的 HTTP 請求。
    • @Path:用于指定路徑參數。在這個例子中,{user}?是 URL 中的占位符,@Path("user")?會把方法參數?user?的值替換到占位符的位置。
步驟 2:創建 Retrofit 實例

借助?Retrofit.Builder?類來創建?Retrofit?實例,同時配置基礎 URL、轉換器工廠等。

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;// 創建 Retrofit 實例
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()).build();
  • 配置解釋
    • baseUrl:設置請求的基礎 URL,后續的相對 URL 會和這個基礎 URL 拼接成完整的請求 URL。
    • addConverterFactory:添加轉換器工廠,這里使用?GsonConverterFactory?把 JSON 響應數據轉換為 Java 對象。
步驟 3:創建網絡請求接口的代理對象

調用?Retrofit?實例的?create()?方法創建網絡請求接口的代理對象。

GitHubService service = retrofit.create(GitHubService.class);
  • 原理分析
    create()?方法利用 Java 的動態代理機制創建代理對象。它會創建一個實現了?GitHubService?接口的代理類實例,并且實現了接口中定義的所有方法。當調用這些方法時,實際上調用的是?InvocationHandler?的?invoke()?方法。
步驟 4:調用代理對象的方法并處理請求

調用代理對象的方法發起網絡請求,并且處理響應結果。

Call<List<Repo>> call = service.listRepos("octocat");
call.enqueue(new Callback<List<Repo>>() {@Overridepublic void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {if (response.isSuccessful()) {List<Repo> repos = response.body();// 處理成功響應} else {// 處理失敗響應}}@Overridepublic void onFailure(Call<List<Repo>> call, Throwable t) {// 處理請求失敗}
});
  • 詳細流程
    • 解析注解:在?InvocationHandler?的?invoke()?方法中,Retrofit 會利用反射讀取方法上的注解信息。對于?listRepos()?方法,會解析?@GET?注解獲取請求方法和相對 URL,解析?@Path?注解獲取路徑參數的值。
    • 構建請求:根據解析得到的注解信息,Retrofit 會構建一個?Request?對象。這個對象包含了請求的所有信息,如請求方法、URL、請求頭、請求體等。
    • 執行請求Request?對象會被傳遞給?OkHttpCall?類,它會使用 OkHttp 庫來執行實際的網絡請求。
    • 處理響應:當收到服務器的響應后,OkHttpCall?會根據之前配置的轉換器工廠把響應數據轉換為 Java 對象。在這個例子中,使用?GsonConverterFactory?把 JSON 數據轉換為?List<Repo>?對象。
    • 回調結果:最后,把處理好的響應結果通過?Callback?接口回調給調用者。

3. 總結

Retrofit 通過自定義注解來描述網絡請求的信息,利用反射機制在運行時解析這些注解,構建請求對象并執行網絡請求。這種基于注解的設計讓代碼更加簡潔、易讀,開發者只需關注業務邏輯,而不用操心網絡請求的底層實現細節。

Retrofit 是一款優秀的 Android 網絡請求庫,除了注解原理外,還有許多核心技術支撐其高效、靈活地工作,以下結合常見面試點進行詳細闡述:

1. 動態代理

  • 原理與作用:Retrofit 運用 Java 的動態代理機制生成網絡請求接口的實現類。當調用?retrofit.create(Service.class)?時,會返回一個實現了指定接口的代理對象。這個代理對象在調用接口方法時,會觸發?InvocationHandler?的?invoke?方法。在面試中,常被問到如何理解 Retrofit 動態代理的作用,其實它的主要作用是將接口方法調用轉化為實際的網絡請求操作,避免了手動編寫大量重復的網絡請求代碼,提高了開發效率。
  • 源碼層面分析:在?Retrofit?類的?create?方法中,通過?Proxy.newProxyInstance?創建代理對象。在?InvocationHandler?的?invoke?方法里,會根據方法上的注解信息,如?@GET@POST?等,構建具體的網絡請求。例如,對于帶有?@GET?注解的方法,會解析出請求的 URL、參數等信息,然后封裝成?Request?對象。

2. OkHttp 集成

  • 基礎支撐:Retrofit 底層依賴 OkHttp 進行實際的網絡請求。OkHttp 是一個高效的 HTTP 客戶端,具有連接池、緩存、請求重試等功能,這些功能也為 Retrofit 帶來了性能上的提升。在面試中,可能會被問到 Retrofit 為什么選擇 OkHttp,原因在于 OkHttp 提供了豐富的 API 來處理網絡請求和響應,并且對 HTTP/2、SPDY 等協議有良好的支持。
  • 定制化配置:可以通過?OkHttpClient?對 Retrofit 的網絡請求進行定制化配置。例如,可以添加攔截器來處理請求頭、日志記錄等。以下是一個添加日志攔截器的示例:
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)).build();Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.example.com/").client(client).addConverterFactory(GsonConverterFactory.create()).build();

在實際項目中,還可以根據需要添加自定義的攔截器,如添加請求頭、處理緩存等。

3. 轉換器工廠(Converter Factory)

  • 數據轉換功能:Retrofit 支持多種數據格式的解析和序列化,這得益于轉換器工廠機制。常見的轉換器工廠有?GsonConverterFactoryJacksonConverterFactory?等。在面試中,會被問到如何實現不同數據格式的處理,答案就是通過添加相應的轉換器工廠。例如,使用?GsonConverterFactory?可以將 JSON 數據自動轉換為 Java 對象,將 Java 對象轉換為 JSON 數據。
  • 自定義轉換器工廠:除了使用官方提供的轉換器工廠,還可以自定義轉換器工廠來滿足特定的需求。例如,對于一些特殊的數據格式或者自定義的序列化規則,可以創建自己的轉換器工廠。自定義轉換器工廠需要實現?Converter.Factory?接口,并重寫相應的方法。

4. 調用適配器工廠(CallAdapter Factory)

  • 適配不同返回類型:Retrofit 支持多種返回類型,如?CallObservableCompletable?等,這是通過調用適配器工廠實現的。調用適配器工廠可以將?OkHttpCall?適配成不同的返回類型。在面試中,可能會被問到如何實現與 RxJava 的集成,其實就是通過添加?RxJava2CallAdapterFactory?來實現的。
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.example.com/").addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();
  • 自定義調用適配器工廠:如果需要支持其他的返回類型或者自定義的異步處理方式,可以自定義調用適配器工廠。自定義調用適配器工廠需要實現?CallAdapter.Factory?接口,并重寫相應的方法。

5. 生命周期管理

  • 與 Android 組件生命周期綁定:在 Android 開發中,需要確保網絡請求與組件的生命周期相匹配,避免內存泄漏。雖然 Retrofit 本身沒有直接提供生命周期管理功能,但可以結合?Lifecycle?組件來實現。例如,使用?Lifecycle?和?LiveData?結合 Retrofit,當組件銷毀時,自動取消網絡請求。在面試中,可能會被問到如何處理網絡請求的生命周期問題,這就需要了解如何結合 Android 的生命周期管理機制來使用 Retrofit。

6. 緩存機制

  • 基于 OkHttp 緩存:由于 Retrofit 基于 OkHttp,所以可以利用 OkHttp 的緩存機制來減少網絡請求。OkHttp 支持 HTTP 緩存策略,通過設置緩存目錄和大小,可以對響應數據進行緩存。在面試中,可能會被問到如何優化網絡請求的性能,緩存機制就是一個重要的優化點。可以通過以下方式配置 OkHttp 的緩存:
File cacheDirectory = new File(context.getCacheDir(), "http_cache");
Cache cache = new Cache(cacheDirectory, 10 * 1024 * 1024); // 10 MBOkHttpClient client = new OkHttpClient.Builder().cache(cache).build();Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.example.com/").client(client).addConverterFactory(GsonConverterFactory.create()).build();

綜上所述,Retrofit 的這些核心技術相互配合,使得它成為一個功能強大、靈活易用的網絡請求庫,在 Android 開發中得到了廣泛的應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903651.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903651.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903651.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows11 編譯 protobuf-3.21.12 c++

下載 protobuf 包&#xff0c;本文使用 3.21.12 版本&#xff0c;Gitub下載鏈接&#xff1a; Github官網 , 網盤下載&#xff1a; 網盤 如果電腦環境沒有安裝 cmake 則需要安裝&#xff0c;本文測試使用 cmake-3.25.1 版本&#xff0c; 下載地址&#xff1a;[camke-3.25.1] (…

Java繼承中super的使用方法

super 關鍵字在 Java 中用于訪問父類的成員&#xff08;包括字段、方法和構造函數&#xff09;。當你在子類中調用父類的方法或訪問父類的成員變量時&#xff0c;super 是必不可少的工具。 &#x1f511; super 的基本用法 1. 調用父類的構造方法 在子類的構造方法中&#x…

網絡安全之淺析Java反序列化題目

前言 這段時間做了幾道Java反序列化題目&#xff0c;發現很多題目都是類似的&#xff0c;并且可以通過一些非預期gadget打進去&#xff0c;就打算總結一下常見的題目類型以及各種解法&#xff0c;并提煉出一般性的思維方法。 正文 分析入口點 拿到題目&#xff0c;有附件最…

動態規劃問題,下降路徑最小和(dp初始化問題,狀態壓縮),單詞拆分(回溯法+剪枝+記憶化),substr函數

下降路徑最小和 題目鏈接&#xff1a; 931. 下降路徑最小和 - 力扣&#xff08;LeetCode&#xff09; 題目描述&#xff1a; 給你一個 n x n 的 方形 整數數組 matrix &#xff0c;請你找出并返回通過 matrix 的下降路徑 的 最小和 。 下降路徑 可以從第一行中的任何元素開…

大數據治理自動化與智能化實踐指南:架構、工具與實戰方案(含代碼)

??個人主頁??:一ge科研小菜雞-CSDN博客 ????期待您的關注 ???? 一、引言:從人治到機治,數據治理正在進化 隨著數據體量持續膨脹、數據場景復雜化,傳統依賴人工規則的大數據治理方式已難以為繼。企業在治理過程中面臨: 數據質量問題激增,人工檢測成本高 元數…

Golang - 實現文件管理服務器

先看效果&#xff1a; 代碼如下&#xff1a; package mainimport ("fmt""html/template""log""net/http""os""path/filepath""strings" )// 配置根目錄&#xff08;根據需求修改&#xff09; //var ba…

Linux-04-用戶管理命令

一、useradd添加新用戶: 基本語法: useradd 用戶名:添加新用戶 useradd -g 組名 用戶:添加新用戶到某個組二、passwd設置用戶密碼: 基本語法: passwd 用戶名:設置用戶名密碼 三、id查看用戶是否存在: 基本語法: id 用戶名 四、su切換用戶: 基本語法: su 用戶名稱:切換用…

Ollama 安裝 QWen3 及配置外網訪問指南

一、Ollama 安裝 QWen3 安裝步驟 首先嘗試運行 QWen3 模型&#xff1a; ollama run qwen3 如果遇到版本不兼容錯誤&#xff08;Error 412&#xff09;&#xff0c;表示需要升級 Ollama&#xff1a; curl -fsSL https://ollama.com/install.sh | sh 驗證版本&#xff1a; o…

高性能架構設計-數據庫(讀寫分離)

一、高性能數據庫簡介 1.高性能數據庫方式 讀寫分離&#xff1a;將訪問壓力分散到集群中的多個節點&#xff0c;沒有分散存儲壓力 分庫分表&#xff1a;既可以分散訪問壓力&#xff0c;又可以分散存儲壓力 2.為啥不用表分區 如果SQL不走分區鍵&#xff0c;很容易出現全表鎖…

【Hive入門】Hive性能優化:執行計劃分析EXPLAIN命令的使用

目錄 1 EXPLAIN命令簡介 1.1 什么是EXPLAIN命令&#xff1f; 1.2 EXPLAIN命令的語法 2 解讀執行計劃中的MapReduce階段 2.1 執行計劃的結構 2.2 Hive查詢執行流程 2.3 MapReduce階段的詳細解讀 3 識別性能瓶頸 3.1 數據傾斜 3.2 Shuffle開銷 3.3 性能瓶頸識別與優化 4 總結 在大…

開源模型應用落地-qwen模型小試-Qwen3-8B-快速體驗(一)

一、前言 阿里云最新推出的 Qwen3-8B 大語言模型,作為國內首個集成“快思考”與“慢思考”能力的混合推理模型,憑借其 80 億參數規模及 128K 超長上下文支持,正在重塑 AI 應用邊界。該模型既可通過輕量化“快思考”實現低算力秒級響應,也能在復雜任務中激活深度推理模式,以…

Kafka Producer的acks參數對消息可靠性有何影響?

1. acks0 可靠性最低生產者發送消息后不等待任何Broker確認可能丟失消息&#xff08;Broker處理失敗/網絡丟失時無法感知&#xff09;吞吐量最高&#xff0c;適用于允許數據丟失的場景&#xff08;如日志收集&#xff09; 2. acks1 (默認值) Leader副本確認模式生產者等待Le…

虛擬機centos7安裝docker

虛擬機CentOS 7上安裝 Docker流程 1. 更新系統軟件包 需要確保系統軟件包是最新的 sudo yum -y update sudo&#xff1a;以超級用戶權限執行命令。 yum&#xff1a;CentOS的包管理器工具。 -y&#xff1a;自動確認所有提示&#xff0c;直接執行。 2. 安裝 Docker 依賴 在安裝 …

ZYNQ MPSOC之PL與PS數據交互DMA方式

ZYNQ MPSOC之PL與PS數據交互DMA方式 1 摘要 XILINX ZYNQ 以及 ZYNQ MPSOC主要優勢在于異構 ARM+FPGA。其中非常關鍵的一點使用了 AXI 總線進行高速互聯。而且這個 AXI 總線是開放給我們用戶使用的。在前面的文章中我們詳解了使用了AXI-HP方式PL到PS端進行數據交互。本文主要涉…

枚舉法——C++算法【淚光2929】

前言 "打牢基礎,萬事不愁" .C的基礎語法的學習."學以致用,邊學邊用",編程是實踐性很強的技術,在運用中理解,總結. 引入 枚舉在成熟框架中,用得還挺多的.枚舉可以讓程序更容易理解 之前寫過一篇關于枚舉的帖子--- 白話編程---數據篇(4)枚…

HarmonyOS NEXT應用開發-Notification Kit(用戶通知服務)notificationManager.cancelAll

1.notificationManager.cancelAll 支持設備Phone2in1TabletCarWearable cancelAll(callback: AsyncCallback<void>): void 取消當前應用所有已發布的通知。使用callback異步回調。 系統能力&#xff1a;SystemCapability.Notification.Notification 示例&#xff1a; …

Mac 創建QT按鈕以及一些操作

在創建QT項目好 后我們打開mainwindow.cpp&#xff0c;下面所示的代碼都是在這個cpp文件里面因為它是窗口的入口函數 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QPushButton>//按鈕的頭文件MainWindow::MainWindow(QWidget *pa…

開源協議全解析:類型、選擇與法律風險規避指南

[TOC] 在當今開源軟件主導的技術生態中&#xff0c;開源協議&#xff08;Open Source License&#xff09;是決定項目能否被商業使用、二次開發的關鍵法律文件。據統計&#xff0c;GitHub上超過70%的項目使用某種形式的開源協議&#xff0c;但其中近30%存在協議兼容性問題。本…

TM1668芯片學習心得一

一、TM1668 是一種帶鍵盤掃描接口的LED&#xff08;發光二極管顯示器&#xff09;驅動控制專用電路&#xff0c;內部集成有MCU 數字接口、數據鎖存器、LED 高壓驅動、鍵盤掃描等電路。本產品性能優良&#xff0c;質量可靠。主要應用于VCR。 學習鏈接 二、 三、顯示寄存器的地址…

時空特征如何融合?LSTM+Resnet有奇效,SOTA方案預測準確率超91%

LSTM有著不錯的時序信息提取能力&#xff0c;ResNet有著不錯的空間特征信息提取能力。如果現在有時空特征融合的創新需求&#xff0c;我們是否能將LSTM和ResNet兩者的優點融合起來呢&#xff1f; 隨著這個思路下去&#xff0c;LSTM ResNet混合模型橫空出世&#xff0c;在各個…