使用 RxJava 進行改造以非同步獲取資料

在 RxJava 的 GitHub 儲存庫中, RxJava 是 Reactive Extensions 的 Java VM 實現:一個用於通過使用可觀察序列來編寫非同步和基於事件的程式的庫。它擴充套件了觀察者模式以支援資料/事件序列,並新增了允許你以宣告方式組合序列的運算子,同時抽象出對低階執行緒,同步,執行緒安全和併發資料結構等問題的關注。

Retrofit 是 Android 和 Java 的型別安全的 HTTP 客戶端,使用它,開發人員可以使所有網路內容更容易。作為示例,我們將下載一些 JSON 並將其作為列表顯示在 RecyclerView 中。

入門:

在你的應用程式級 build.gradle 檔案中新增 RxJava,RxAndroid 和 Retrofit 依賴項:compile "io.reactivex:rxjava:1.1.6"
compile "io.reactivex:rxandroid:1.2.1"
compile "com.squareup.retrofit2:adapter-rxjava:2.0.2"
compile "com.google.code.gson:gson:2.6.2"
compile "com.squareup.retrofit2:retrofit:2.0.2"
compile "com.squareup.retrofit2:converter-gson:2.0.2"

定義 ApiClient 和 ApiInterface 以從伺服器交換資料

public class ApiClient {

private static Retrofit retrofitInstance = null;
private static final String BASE_URL = "https://api.github.com/";

public static Retrofit getInstance() {
    if (retrofitInstance == null) {
        retrofitInstance = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofitInstance;
}

public static <T> T createRetrofitService(final Class<T> clazz, final String endPoint) {
    final Retrofit restAdapter = new Retrofit.Builder()
            .baseUrl(endPoint)
            .build();

    return restAdapter.create(clazz);
}

public static String getBaseUrl() {
    return BASE_URL;
}}

公共介面 ApiInterface {

@GET("repos/{org}/{repo}/issues")
Observable<List<Issue>> getIssues(@Path("org") String organisation,
                                  @Path("repo") String repositoryName,
                                  @Query("page") int pageNumber);}

請注意,getRepos() 返回一個 Observable,而不僅僅是一個問題列表。

定義模型

顯示了一個例子。你可以使用 JsonSchema2Pojo 等免費服務。

public class Comment {

@SerializedName("url")
@Expose
private String url;
@SerializedName("html_url")
@Expose
private String htmlUrl;

//Getters and Setters
}

建立 Retrofit 例項

ApiInterface apiService = ApiClient.getInstance().create(ApiInterface.class);

然後,使用此例項從伺服器獲取資料

Observable<List<Issue>> issueObservable = apiService.getIssues(org, repo,                 pageNumber);
    issueObservable.subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .map(issues -> issues)    //get issues and map to issues list
            .subscribe(new Subscriber<List<Issue>>() {
                @Override
                public void onCompleted() {
                    Log.i(TAG, "onCompleted: COMPLETED!");
                }

                @Override
                public void onError(Throwable e) {
                    Log.e(TAG, "onError: ", e);
                }

                @Override
                public void onNext(List<Issue> issues) {
                    recyclerView.setAdapter(new IssueAdapter(MainActivity.this, issues, apiService));
                }
            });

現在,你已使用 Retrofit 和 RxJava 成功從伺服器獲取資料。