使用 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 成功从服务器获取数据。