簡介
????????在Retrofit中,如果你想直接獲取HTML或其他文本格式的響應內容而不是將其映射到一個模型類,ScalarsConverterFactory
就派上用場了。ScalarsConverterFactory
是一個轉換器工廠,它能夠將響應體轉換為Java基本類型如String、Integer或Byte[]等標量值。對于解析HTML而言,最直接的應用就是將整個HTML內容作為字符串獲取。
一、附加依賴
添加依賴包為:
com.squareup.retrofit2:retrofit:2.x.y
com.squareup.retrofit2:converter-scalars:2.x.y
com.squareup.retrofit2:converter-gson:2.x.y
org.jsoup:jsoup:1.17.2
File中找到Project Structure:
? ? ? ? 添加Library Dependency
輸入網址域名com.squareup.retrofit2
附加成功:
ScalarsConverterFactory.create()
是Retrofit庫中的一個轉換器工廠方法,它允許Retrofit將HTTP響應體直接轉換為Java的基本類型或字符串等標量值,而不是轉換為特定的模型對象。這對于處理文本、JSON字符串或二進制數據等非結構化響應非常有用。
二、配置Retrofit
??初始化構建器(Retrofit):
????????new Retrofit.Builder()
?創建了一個?Retrofit.Builder
?實例。Builder 是一個設計模式,它允許你通過一系列配置步驟來創建復雜的對象。在這里,就是用來配置 Retrofit 的各種參數,最終構建出一個 Retrofit 實例。
baseUrl目標地址域名:
????????指定所有網絡請求的基礎 URL。這是所有相對路徑請求的基礎。
轉換器工廠ConverterFactory:
????????轉換器的作用是將從網絡請求得到的響應體轉換成 Java 對象。這里使用的 ScalarsConverterFactory
是專門用來處理文本類型的響應體,比如字符串、byte數組等。如果你的 API 返回的是 JSON 數據,通常會使用 GsonConverterFactory
或 MoshiConverterFactory。
?.build()完成構建:
????????最后,調用 build()
方法來完成 Retrofit 實例的創建。這一步會根據之前設置的所有配置項,構建出一個可用的 Retrofit 實例。
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://your.api.base.url/").addConverterFactory(ScalarsConverterFactory.create()).build();
三、定義網址(API)接口
接下來,在定義API接口時,并定義網絡請求方法getHtmlContent(),可以聲明方法返回類型為Call<String>
或其他標量類型,例如:
四、發起請求并處理響應
創建接口實例:
????????通過retrofit.create(WHttp.class)
創建了一個接口WHttp
的實例。這里假設WHttp
接口定義了網絡請求的方法,如getHtmlContent()
,這個方法對應于獲取HTML內容的網絡請求。
獲取html內容:
????????通過getHtmlContent()方法對應于獲取HTML內容的網絡請求。
enqueue異步請求:
????????call.enqueue()
方法發起一個異步HTTP請求。這意味著當請求開始時,應用不會被阻塞,可以繼續處理其他任務。請求的結果會在主線程(UI線程)中通過onResponse
或onFailure
回調方法通知。成功響應 (onResponse
)與失敗響應 (onFailure
)。
成功響應 (onResponse
):成功響應就可獲取html內容,并做解析處理。
失敗響應 (onFailure
):將錯誤信息通過Throwable t
傳入,然后將錯誤信息簡單地設置到一個名為textView
的TextView控件中展示給用戶。
五、Jsoup解析html
html解析內容:
response.body()
獲取內容:
????????String html = response.body();
: 從Retrofit的響應對象中獲取HTML內容。這是之前網絡請求的結果,存儲為一個字符串。
Jsoup解析(Document)
html字符串:
????????Document doc = Jsoup.parse(html);
: 使用Jsoup庫來解析這個HTML字符串,創建一個Document對象。Jsoup是一個用于解析HTML的Java庫,非常適用于提取和操作HTML數據。
Jsoup的選擇器語法:
????????String description = doc.select("meta[name=description]").attr("content");
: 利用Jsoup的選擇器語法,從Document中選擇所有<meta>
標簽,其中name
屬性為description
的元素,并從中提取content
屬性的值。這通常用來獲取網頁的描述信息。
傳入數據UI控件顯示(setText):
????????textView.setText(description);
: 最后,將提取到的描述信息設置給一個名為textView
的TextView組件的文本內容。這將在UI界面上顯示提取到的描述信息。
六、啟用線程
?new Thread線程:
????????new Thread(new Runnable() { ... })
: 創建一個新的線程。在Android中,網絡請求和耗時操作通常不應在主線程(UI線程)執行,以免阻塞UI導致應用無響應(ANR)。因此,這里使用一個新的線程來執行耗時的HTML解析操作。public void run() { ... }
: 這是Runnable接口中的run
方法,定義了在線程啟動(.start())后要執行的操作
new Thread(new Runnable() {@Overridepublic void run() {runOnUiThread(new Runnable() {@Overridepublic void run() {String html = response.body();Document doc = Jsoup.parse(html);String description = doc.select("meta[name=description]").attr("content");textView.setText(description);}});}}).start();
?runOnUiThread?
UI線程:
????????runOnUiThread(new Runnable() { ... })
: 因為Android不允許在非UI線程直接更新UI組件,所以這里使用runOnUiThread
方法來確保UI更新操作在主線程中執行。runOnUiThread
是Activity或View的成員方法,可以接受一個Runnable對象,確保其在UI線程運行。public void run() { ... }
: 這是第二個Runnable對象中的run
方法,定義了要在UI線程執行的操作。
runOnUiThread(new Runnable() {@Overridepublic void run() {String html = response.body();Document doc = Jsoup.parse(html);String description = doc.select("meta[name=description]").attr("content");textView.setText(description);}});
最終效果:
? ? ? ? 簡要總結:添加依賴包+初始化構建器(baseurl(地址域名),轉換器(ConverterFactory),build構建)+實例化接口+調用接口方法獲取數據+enqueue異步請求+線程+解析數據
?
?
?
?
?
?
?
?