㈠ retrofit 2 支持rxjava2了嗎
,一、 簡介 Retrofit是Square公司開發的一款針對Android網路請求的框架,Retrofit2底層基於OkHttp實現的,OkHttp現在已經得到Google官方認可,大量的app都採用OkHttp做網路請求,其源碼詳見OkHttp Github。 本文全部是在Retrofit2.0+版本基礎上論...
㈡ 如何用RxJava2.0.7和Retrofit2.2.0優雅的實現網路請求
RxJava要比EventBus的應用更廣泛,EventBus僅僅是作為一種消息的傳遞工具,但是RxJava裡面幾乎可以做任何事情。
如果是Android開發的話,可以使用RxAndroid,這是對RxJava的一個擴展,結合sqare公司的retrofit可以很輕松的完成網路的訪問。
我們知道,在Android中非同步操作一般使用AsycTask來完成,但是AsycTask有很多缺點,如不能方便的終止任務的執行等。
RxAndroid完全可以替代AsycTask來完成各種非同步操作,而且還有BindActivity和BindFragment方法,你根本不需要考慮非同步操作時的Activity和Fragment的生命周期問題,還有更加強大的的鏈式調用,可以使程序很簡潔。
EventBus有個缺點就是凡是使用了EventBus的類都不能進行混淆了,否則Evnetbus就找不到OnEvent方法了。
以上,推薦使用RxAndroid
㈢ Android網路請求庫【OkHttp4.9.3】基本用法與原理分析
OkHttp是一套處理 HTTP 網路請求的依賴庫,由 Square 公司設計研發並開源,目前可以在 Java 和 Kotlin 中使用。對於 Android App 來說,OkHttp 現在幾乎已經占據了所有的網路請求操作,Retrofit + OkHttp實現網路請求似乎成了一種標配。因此它也是每一個 Android 開發工程師的必備技能,了解其內部實現原理可以更好地進行功能擴展、封裝以及優化。
OkHttp的高效性體現在:
第一步:創建OkHttpClient,創建OkHttpClient有兩種方式:
OkHttpClient提供了豐富的配置方法,例如添加攔截器、指定連接池、設置請求超時等等。
第二步:創建請求
使用Request.Builder() 構建Request實例
第三步:發起網路請求
OkHttp支持同步和非同步兩種請求方式
OkHttp的使用方法非常簡單,三步操作就可以發起一個簡單的同步或非同步請求。我們也可以很輕松地對網路請求進行配置,例如添加請求頭、設置請求方式、設置請求超時等等,這些配置參數會在源碼分析過程中詳細介紹。
現在我們已經學會了三步操作發起網路請求,接下來以這三個步驟為切入點,深入到源碼中學習OkHttp的實現原理,廢話少說馬上開車。
OkHttpClient創建方式有兩種,我們看看兩種方式有什麼區別。
第一種直接使用默認構造函數,內部依然是使用建造者模式
第二種使用建造者模式
兩種方式最終都是調用構造函數OkHttpClient(builder:Builder),由參數builder負責所有的參數配置工作。
當您創建單個OkHttpClient實例並將其用於所有 HTTP 調用時,OkHttp 性能最佳。 這是因為每個OkHttpClient都擁有自己的連接池和線程池,重用連接和線程可減少延遲並節省內存。 相反,為每個請求創建一個客戶端會浪費空閑池上的資源。
Request同樣使用建造者模式來創建,這里貼上部分重要源碼,很簡單就不細說了。
OkHttp發起網路請求分為同步請求和非同步請求兩種方式,我們只分析非同步請求流程,因為只要理解了非同步請求過程,基本上也就明白同步請求是怎麼一回事了。
RealCall是連接應用層與網路層的橋梁,負責處理連接、請求、響應和數據流。
Dispatcher維護著一套非同步任務執行策略,分析策略之前先介紹幾個重要概念:
client.dispatcher.enqueue(AsyncCall(responseCallback)) 執行步驟為:
AsyncCall實現了Runnable介面,因此一旦被線程池中的線程處理就會調用它的run()方法:
話休絮煩,我們開始分析攔截器責任鏈:
責任鏈執行流程:首先獲取當前攔截器interceptor,並且調用interceptor.intercept(next)執行攔截器操作。這里的next表示的是index+1後的責任鏈對象,攔截器的intercept()方法內部會調用next.proceed(request)方法再次進入到責任鏈,由於此時index已經加1,所以處理的是下一個攔截器。
如此循環往復,直到處理完責任鏈上最後一個攔截器為止。
注意除最後一個攔截器CallServerInterceptor不會調用chain.proceed(request)方法之外,其他攔截器都應該至少調用一次chain.proceed(request)方法。
為了驗證上面的結論,我們進入到RetryAndFollowUpInterceptor的intercept()方法一探究竟:
可以看到注釋1處重新進入責任鏈處理下一個攔截器。
有興趣可以自行查看最後一個攔截器CallServerInterceptor源碼,此處只給出本人閱讀源碼後得出的結論:
以上就是攔截器責任鏈的工作流程,我們再通過流程圖仔細感受一下。
分析完攔截器責任鏈,我們繼續分析AsyncCall#run()方法:
我們看到,如果()方法成功獲得服務端返回的數據,則調用responseCallback.onResponse(this@RealCall, response)方法完成非同步回調;如果服務端數據獲取失敗(請求異常),則調用responseCallback.onFailure(this@RealCall, canceledException)方法完成非同步回調
需要注意的是,responseCallback回調是在子線程中完成的,所以如果想把數據顯示到UI上,需要切換回主線程進行UI操作。
OkHttp發起網路請求全過程:
【知識點】OkHttp 原理 8 連問
㈣ 如何用 Retrofit 2 在安卓上實現 HTTP 訪問
Retrofit是Square Inc.發布在開源社區的一款令人嘆為觀止的工具。它是一個類型安全的 HTTP 客戶端,適用於安卓和 Java 應用。
類型安全 HTTP 客戶端主要意味著,你只需關心發送出去的網路請求的語義,而不必考慮 URL 構建的細節,以及參數設定是否正確之類的事。Retrofit應對這些易如反掌,你只需寫幾個介面即可。就是這么簡單!
我們通過一個例子來看看它是怎麼實現的。筆者已經把這里所有的代碼都放在了 Github 的 資源庫里。如你所知,最好的學習方法就是查看這些代碼,自己調試調試。
首先,筆者在 Android Studio 里建了一個空項目。老實說,每次看到歡迎界面上出現的那堆有關兼容性、以及應用所支持的 API 的選項,筆者都會感到非常迷茫。
好在我們只是弄個「玩具」項目而已,因此我們可以大膽地選擇最新的 SDK,然後快速掠過項目向導,進入我們偉大的「hello world」安卓應用。
如果你自己不想糾結這些選項,可以直接點擊這個 Github 的鏈接,導入筆者提交的現成項目:Floating button app skeleton.
通常,筆者在所有項目中都會啟用 JRebel for Android。這是一個 Android Studio 的插件。「啟用它」基本上意味著,只需點擊一下自定義按鈕就能運行應用,其餘所有工作都交給它了。JRebel for Android 對安卓開發者來說是一款提升效率的工具,它可以在運行著的設備和模擬器上即時更新代碼。這本質上意味著在開發應用時,你不必浪費寶貴的時間來等待應用重啟,並因此而中途放棄這些應用的狀態記錄。總之特別棒!
說明一下,我在 ZeoTurnaround 公司工作,也就是創造JRebel for Android的公司。但它真的很好用,你值得一試。
Android Studio 2.0附帶的新模擬器用著也很爽。現在,MainActivity 類的模擬器屏幕被激活了。
點一下浮動按鈕,出現 snackbar。看起來不錯。讓我們隨意更改一段代碼,檢驗一下代碼重新載入的功能。筆者首先想到的是修改 snackbar 的字元串值。
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, 「Super fast hello world」, Snackbar.LENGTH_LONG)
.setAction(「Action」, null).show();
}
});
注意看,我們保存了一個文件,點擊了一下按鈕,接著模擬器上的代碼就重新載入了。現在一切就緒!也就是說,我們可以研究 Retrofit 2 到底有什麼用處了。
Retrofit 2 是一個類型安全的 HTTP 客戶端,適用於安卓(及 Java)。但首先,它也是一個庫。所以我們要先聲明依賴。這個容易。不過,請注意,我們需要顯式依賴gson 轉換器,將 JSON 應答轉換為 model 類。這與Retrofit 1不同。所以需要注意一下。
Add these two lines to the build.gradle file:
將這兩行代碼加到 build.gradle 文件中去:
compile 『com.squareup.retrofit2:retrofit:2.0.0-beta2』
compile 『com.squareup.retrofit2:gson-converter:2.0.0-beta2』
Retrofit 的主要功能是可以在運行時生成代碼,發送 HTTP服務查詢請求。開發者只需寫一個「說明」介面即可。假設我們有如下的一個 model 類:
通過這個我們可以創建一個名為GithubService的介面,用於實現 HTTP 通信。
public interface GitHubService {
@GET(「repos/{owner}/{repo}/contributors」)
Call<List<Contributor>> repoContributors(
@Path(「owner」) String owner,
@Path(「repo」) String repo);
}
This is the simplest example, we add the @GET annotation on an interface method and provide the path part of the URL that we want to expose it on. Conveniently, the method parameters can be referenced in the path string so you won』t need to jump through hoops to set those. Additionally, with other annotations you can specify query parameters, POST request body and so on:
@Query(「key」) — for GET request query parameter
@QueryMap — for the map of parameters
@Body — use it with the @POST annotation to provide the query body content.
這是一個最簡單的例子。我們在介面方法中加入 @GET 註解,並且提供想要展示的 URL 的path部分。方便的是,由於可以在 path 字元串中引用方法參數,因此我們無需跳出循環再重新設定。另外,通過這些註解,你可以設定查詢參數,以及 POST 請求主體等等:
@Query(「key」) -- 用於GET請求查詢參數
@QueryMap -- 用於參數映射
@Body -- 與@POST註解一起使用,提供查詢主體內容
下面,為了能在運行時使用這個介面,我們需要構建一個 Retrofit 對象:
interface GitHubService {
@GET("repos/{owner}/{repo}/contributors")
Call<List<Contributor>> repoContributors(
@Path("owner") String owner,
@Path("repo") String repo);
public static final Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
筆者傾向於在包含網站請求的介面內使用 Retrofit builder。這么做並不是想讓它變得復雜難懂。而是處於通用配置的考慮。例如,我們有默認的轉換器,將 JSON 響應對象轉為 Java 對象,但是,即使在每個 service 中復制粘貼一遍,也好過使用單一的抽象類,後者很容易造成泄漏。
With these pieces in place, we just need to perform the network call:
the specification of our queries
the Retrofit object builder
准備好這些代碼後,我們只需發出網路請求:
請求的說明
Retrofit對象builder
為了實現GitHubService介面,需要初始化一個用於執行 HTTP 查詢請求的 Call 對象。
GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class);
Call<List<Contributor>> call = gitHubService.repoContributors(「square」, 「retrofit」);
List<Contributor> result = call.execute().body();
另外,有人可能也會選擇設定請求的時間,讓它成為非同步請求,同時在執行完畢後提供 callback。
call.enqueue(new Callback<List<Contributor>>() {
@Override
public void onResponse(Response<List<Contributor>> response, Retrofit retrofit) {
// handle success
}
@Override
public void onFailure(Throwable t) {
// handle failure
}
});
聽起來超簡單!我們來處理一下 UI,然後寫入代碼。在浮動按鈕的應用模板下,我們需要修改 content_main.xml 文件。筆者添加了一個發起請求查詢的按鈕,以及一個用以顯示請求結果的文本區域:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fetch"
android:id="@+id/button"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="151dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text=""
android:id="@+id/textView"
android:layout_above="@+id/button"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:textIsSelectable="false" />
第一次執行時,你的網路請求代碼看起來可能是這樣的:
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class);
Call<List<Contributor>> call = gitHubService.repoContributors(「square」, 「retrofit」);
String result = call.execute().body().toString();
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(result);
}
});
這段代碼自然無法運行。安卓框架不允許用戶在 UI 線程中執行網路請求。UI 線程只應該用來處理一些用戶輸入。在這個線程中執行任何引起長時間阻塞的操作都會讓用戶體驗變得非常糟糕。
因此,我們需要重構這段代碼,把網路請求移入後台線程。使用 JRebel for Android 可以不費任何時間就搞定這事。我們將代碼提取到 AsyncTask -- 這是一個在安卓上運行大型運算的默認框架。AsyncTask不太好看,它的具體運行方式也不算清潔,例如每次我們點擊按鈕時它都會去創建一個 Retrofit 對象。但是能用就行。
private class NetworkCall extends AsyncTask<Call, Void, String> {
@Override
protected String doInBackground(Call… params) {
try {
Call<List<Contributor>> call = params[0];
Response<List<Contributor>> response = call.execute();
return response.body().toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
final TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(result);
}
}
接著,從 EventListener 中調用它:
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class);
final Call<List<Contributor>> call = gitHubService.repoContributors("square", "retrofit");
new NetworkCall().execute(call);
}
});
好啦,現在代碼可以運行了。文本視圖會根據 HTTP 請求的結果實時刷新。
㈤ 如何用RxJava2.0.7和Retrofit2.2.0優雅的實現網路請求
響應式代碼基本組部ObservablesSubscribers(事實Observer才構建塊實踐使用SubscriberSubscriber才Observables應)Observable發送消息Subscriber則用於消費消息 RxJava 基本概念 Observable (觀察者即觀察者) Observer (觀察者) subscribe (訂閱)、事件 Scheler 調度器相於線程式控制制器 Observable Observer 通 subscribe() 實現訂閱關系 Observable 需要候發事件通知 Observe
㈥ 如何用RxJava2.0.7和Retrofit2.2.0優雅的實現網路請求
RxJava要比EventBus的應用更廣泛,EventBus僅僅是作為一種消息的傳遞工具,但是RxJava裡面幾乎可以做任何事情。
如果是Android開發的話,可以使用RxAndroid,這是對RxJava的一個擴展,結合sqare公司的retrofit可以很輕松的完成網路的訪問。
我們知道,在Android中非同步操作一般使用AsycTask來完成,但是AsycTask有很多缺點,如不能方便的終止任務的執行等。
RxAndroid完全可以替代AsycTask來完成各種非同步操作,而且還有BindActivity和BindFragment方法,你根本不需要考慮非同步操作時的Activity和Fragment的生命周期問題,還有更加強大的的鏈式調用,可以使程序很簡潔。
EventBus有個缺點就是凡是使用了EventBus的類都不能進行混淆了,否則Evnetbus就找不到OnEvent方法了。
以上,推薦使用RxAndroid。
㈦ 如何用RxJava2.0.7和Retrofit2.2.0優雅的實現網路請求
rxjava+retrofit請求網路為什麼拋出數組越界異常主線程默認有Runloop。當自己啟動一個線程,如果只是用於處理單一的事件,則該線程在執行完之後就退出了。所以當我們需要讓該線程監聽某項事務時,就得讓線程一直不退出,runloop就是這么一個循環,沒有事件的時候,一直卡著,有事件來臨了,執行其對應的函數。RunLoop,正如其名所示,是線程進入和被線程用來相應事件以及調用事件處理函數的地方.需要在代碼中使用控制語句實現RunLoop的循環,也就是說,需要代碼提供while或者for循環來驅動RunLoop.在這個循環中,使用一個runLoop對象[NSRunloopcurrentRunloop]執行接收消息,調用對應的處理函數.
㈧ 如何用 Retrofit 2 在安卓上實現 HTTP 訪問
通常,筆者在所有項目中都會啟用 JRebel for Android。這是一個 Android Studio 的插件。「啟用它」基本上意味著,只需點擊一下自定義按鈕就能運行應用,其餘所有工作都交給它了。JRebel for Android 對安卓開發者來說是一款提升效率的工具,它可以在運行著的設備和模擬器上即時更新代碼。這本質上意味著在開發應用時,你不必浪費寶貴的時間來等待應用重啟,並因此而中途放棄這些應用的狀態記錄。總之特別棒!
說明一下,我在 ZeoTurnaround 公司工作,也就是創造JRebel for Android的公司。但它真的很好用,你值得一試。
Android Studio 2.0附帶的新模擬器用著也很爽。現在,MainActivity 類的模擬器屏幕被激活了。
點一下浮動按鈕,出現 snackbar。看起來不錯。讓我們隨意更改一段代碼,檢驗一下代碼重新載入的功能。筆者首先想到的是修改 snackbar 的字元串值。
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, 「Super fast hello world」, Snackbar.LENGTH_LONG)
.setAction(「Action」, null).show();
}
});
注意看,我們保存了一個文件,點擊了一下按鈕,接著模擬器上的代碼就重新載入了。現在一切就緒!也就是說,我們可以研究 Retrofit 2 到底有什麼用處了。
Retrofit 2 是一個類型安全的 HTTP 客戶端,適用於安卓(及 Java)。但首先,它也是一個庫。所以我們要先聲明依賴。這個容易。不過,請注意,我們需要顯式依賴gson 轉換器,將 JSON 應答轉換為 model 類。這與Retrofit 1不同。所以需要注意一下。
Add these two lines to the build.gradle file:
將這兩行代碼加到 build.gradle 文件中去:
compile 『com.squareup.retrofit2:retrofit:2.0.0-beta2』
compile 『com.squareup.retrofit2:gson-converter:2.0.0-beta2』
Retrofit 的主要功能是可以在運行時生成代碼,發送 HTTP服務查詢請求。開發者只需寫一個「說明」介面即可。假設我們有如下的一個 model 類:
通過這個我們可以創建一個名為*GithubService*的介面,用於實現 HTTP 通信。
public interface GitHubService {
@GET(「repos/{owner}/{repo}/contributors」)
Call<List<Contributor>> repoContributors(
@Path(「owner」) String owner,
@Path(「repo」) String repo);
}
This is the simplest example, we add the @GET annotation on an interface method and provide the path part of the URL that we want to expose it on. Conveniently, the method parameters can be referenced in the path string so you won』t need to jump through hoops to set those. Additionally, with other annotations you can specify query parameters, POST request body and so on:
@Query(「key」) — for GET request query parameter
@QueryMap — for the map of parameters
@Body — use it with the @POST annotation to provide the query body content.
這是一個最簡單的例子。我們在介面方法中加入 @GET 註解,並且提供想要展示的 URL 的**path**部分。方便的是,由於可以在 path 字元串中引用方法參數,因此我們無需跳出循環再重新設定。另外,通過這些註解,你可以設定查詢參數,以及 POST 請求主體等等:
@Query(「key」) -- 用於GET請求查詢參數
@QueryMap -- 用於參數映射
@Body -- 與@POST註解一起使用,提供查詢主體內容
下面,為了能在運行時使用這個介面,我們需要構建一個 Retrofit 對象:
interface GitHubService {
@GET("repos/{owner}/{repo}/contributors")
Call<List<Contributor>> repoContributors(
@Path("owner") String owner,
@Path("repo") String repo);
public static final Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
筆者傾向於在包含網站請求的介面內使用 Retrofit builder。這么做並不是想讓它變得復雜難懂。而是處於通用配置的考慮。例如,我們有默認的轉換器,將 JSON 響應對象轉為 Java 對象,但是,即使在每個 service 中復制粘貼一遍,也好過使用單一的抽象類,後者很容易造成泄漏。
With these pieces in place, we just need to perform the network call:
the specification of our queries
the Retrofit object builder 准備好這些代碼後,我們只需發出網路請求:
請求的說明
Retrofit對象builder
為了實現*GitHubService*介面,需要初始化一個用於執行 HTTP 查詢請求的 Call 對象。
GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class);
Call<List<Contributor>> call = gitHubService.repoContributors(「square」, 「retrofit」);
List<Contributor> result = call.execute().body();
另外,有人可能也會選擇設定請求的時間,讓它成為非同步請求,同時在執行完畢後提供 callback。
call.enqueue(new Callback<List<Contributor>>() {
@Override
public void onResponse(Response<List<Contributor>> response, Retrofit retrofit) {
// handle success
}
@Override
public void onFailure(Throwable t) {
// handle failure
}
});
聽起來超簡單!我們來處理一下 UI,然後寫入代碼。在浮動按鈕的應用模板下,我們需要修改 content_main.xml 文件。筆者添加了一個發起請求查詢的按鈕,以及一個用以顯示請求結果的文本區域:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fetch"
android:id="@+id/button"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="151dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text=""
android:id="@+id/textView"
android:layout_above="@+id/button"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:textIsSelectable="false" />
第一次執行時,你的網路請求代碼看起來可能是這樣的:
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class);
Call<List<Contributor>> call = gitHubService.repoContributors(「square」, 「retrofit」);
String result = call.execute().body().toString();
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(result);
}
});
這段代碼自然無法運行。安卓框架不允許用戶在 UI 線程中執行網路請求。UI 線程只應該用來處理一些用戶輸入。在這個線程中執行任何引起長時間阻塞的操作都會讓用戶體驗變得非常糟糕。
因此,我們需要重構這段代碼,把網路請求移入後台線程。使用 JRebel for Android 可以不費任何時間就搞定這事。我們將代碼提取到 AsyncTask -- 這是一個在安卓上運行大型運算的默認框架。AsyncTask不太好看,它的具體運行方式也不算清潔,例如每次我們點擊按鈕時它都會去創建一個 Retrofit 對象。但是能用就行。
private class NetworkCall extends AsyncTask<Call, Void, String> {
@Override
protected String doInBackground(Call… params) {
try {
Call<List<Contributor>> call = params[0];
Response<List<Contributor>> response = call.execute();
return response.body().toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
final TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(result);
}
}
接著,從 EventListener 中調用它:
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class);
final Call<List<Contributor>> call = gitHubService.repoContributors("square", "retrofit");
new NetworkCall().execute(call);
}
});
好啦,現在代碼可以運行了。文本視圖會根據 HTTP 請求的結果實時刷新。
現在,這個框架應用程序已經完成了,代碼順利構建並運行完畢。你可以自己去試試 Retrofit和JRebel for Android 。隨意修改一些代碼,檢查一下新代碼構成的應用程序運行效果如何,也不會浪費任何時間。嘗試為 Contributor 類增加幾個區域,替換 contributor 組件的 文本視圖,更改 HTTP 的端點,將請求發往另一個站點。一切盡在你掌握!
在本文中,我們了解了如何使用 Retrofit 2 創建一個發送網路請求的簡易框架應用程序。程序的代碼可以在 Github 上找到。對本文的最佳使用方式是,將它看作一篇快速指導,根據你的側重點寫一段自己的代碼,接著復制這個應用程序的代碼,導入 Android studio,然後試試你自己的代碼吧!
㈨ 如何用 Retrofit 2 在安卓上實現 HTTP 訪問
1、通過配置gradle配置將Retrofit框架引入項目。
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
2、編寫API服務代碼
public interface ApiService {
@GET("service/getIpInfo.php")
Call<GetIpInfoResponse> getIpInfo(@Query("ip") String ip);
}
3.定義接收數據的response
public class GetIpInfoResponse extends BaseResponse {
public IpInfo data;
}
4.請求數據並顯示
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ENDPOINT)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiService apiService = retrofit.create(ApiService.class);
mProgressBar.setVisibility(View.VISIBLE);
Call<GetIpInfoResponse> call = apiService.getIpInfo("63.223.108.42");
call.enqueue(new Callback<GetIpInfoResponse>() {
@Override
public void onResponse(Response<GetIpInfoResponse> response, Retrofit retrofit) {
mProgressBar.setVisibility(View.GONE);
GetIpInfoResponse getIpInfoResponse = response.body();
mTvContent.setText(getIpInfoResponse.data.country);
}
@Override
public void onFailure(Throwable t) {
mProgressBar.setVisibility(View.GONE);
mTvContent.setText(t.getMessage());
}
});
㈩ 如何用 Retrofit 2 在安卓上實現 HTTP 訪問
Retrofit是Square Inc.發布在開源社區的一款令人嘆為觀止的工具。它是一個類型安全的 HTTP 客戶端,適用於安卓和 Java 應用。
類型安全 HTTP 客戶端主要意味著,你只需關心發送出去的網路請求的語義,而不必考慮 URL 構建的細節,以及參數設定是否正確之類的事。Retrofit應對這些易如反掌,你只需寫幾個介面即可。就是這么簡單!
我們通過一個例子來看看它是怎麼實現的。筆者已經把這里所有的代碼都放在了 Github 的 資源庫里。如你所知,最好的學習方法就是查看這些代碼,自己調試調試。
首先,筆者在 Android Studio 里建了一個空項目。老實說,每次看到歡迎界面上出現的那堆有關兼容性、以及應用所支持的 API 的選項,筆者都會感到非常迷茫。
好在我們只是弄個「玩具」項目而已,因此我們可以大膽地選擇最新的 SDK,然後快速掠過項目向導,進入我們偉大的「hello world」安卓應用。
如果你自己不想糾結這些選項,可以直接點擊這個 Github 的鏈接,導入筆者提交的現成項目:Floating button app skeleton.
通常,筆者在所有項目中都會啟用 JRebel for Android。這是一個 Android Studio 的插件。「啟用它」基本上意味著,只需點擊一下自定義按鈕就能運行應用,其餘所有工作都交給它了。JRebel for Android 對安卓開發者來說是一款提升效率的工具,它可以在運行著的設備和模擬器上即時更新代碼。這本質上意味著在開發應用時,你不必浪費寶貴的時間來等待應用重啟,並因此而中途放棄這些應用的狀態記錄。總之特別棒!
說明一下,我在 ZeoTurnaround 公司工作,也就是創造JRebel for Android的公司。但它真的很好用,你值得一試。
Android Studio 2.0附帶的新模擬器用著也很爽。現在,MainActivity 類的模擬器屏幕被激活了。
點一下浮動按鈕,出現 snackbar。看起來不錯。讓我們隨意更改一段代碼,檢驗一下代碼重新載入的功能。筆者首先想到的是修改 snackbar 的字元串值。
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, 「Super fast hello world」, Snackbar.LENGTH_LONG)
.setAction(「Action」, null).show();
}
});
注意看,我們保存了一個文件,點擊了一下按鈕,接著模擬器上的代碼就重新載入了。現在一切就緒!也就是說,我們可以研究 Retrofit 2 到底有什麼用處了。
Retrofit 2 是一個類型安全的 HTTP 客戶端,適用於安卓(及 Java)。但首先,它也是一個庫。所以我們要先聲明依賴。這個容易。不過,請注意,我們需要顯式依賴gson 轉換器,將 JSON 應答轉換為 model 類。這與Retrofit 1不同。所以需要注意一下。
Add these two lines to the build.gradle file:
將這兩行代碼加到 build.gradle 文件中去:
compile 『com.squareup.retrofit2:retrofit:2.0.0-beta2』
compile 『com.squareup.retrofit2:gson-converter:2.0.0-beta2』
Retrofit 的主要功能是可以在運行時生成代碼,發送 HTTP服務查詢請求。開發者只需寫一個「說明」介面即可。假設我們有如下的一個 model 類:
通過這個我們可以創建一個名為GithubService的介面,用於實現 HTTP 通信。