本篇讲述RxJava+retrofit相结合的案例应用。
关于retrofit的介绍参见我的前一篇文章:Retrofit用法(一)快速入门,本篇介绍的是结合RxJava之后的写法与应用演示。
如果你对RxJava还不太了解,没关系,看完本篇文章的demo再去看大神们的详细介绍,理解效果更佳。
最近几天专注学习了下Rxjava与retrofit的几篇文章,刚开始确实有点懵逼,不过随着案例的介入,思路也
逐渐清晰了起来,这里做下笔记,力求用最简单的案例最少的代码说明问题。
还是简单说明下Rxjava,可以理解为就是一种异步机制,类似handler,AsyncTask ,不过远比后两者强大的多,异步操作很重要的一点就是程序的简洁性,而面对复杂的任务调度,安卓的异步机制会使代码既难写又难懂,而Rxjava的优势在于,随着代码逻辑的越来越复杂,它依然能保持简洁。
其内部原理是基于一种拓展的观察者模式来实现的。
我们熟知的普通的观察者模式有Button的onclickListener:
对于RxJava是这样的:在Rxjava里有这样几个概念:订阅subscribe(),观察者observer,被观察者obervable,以及触发的事件。道理很简单,就像EventBus的使用。不过对于Rxjava,onNext()执行完后才会执行onComplete(),这是对于正常事件流程而言,如果onNext()执行过程出现异常,会走onError,而不会执行onComplete()方法了。
好了,原理性的东西就介绍这么多,下面从实例代码来学习具体的用法。
1.添加项目依赖
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
2.写请求服务接口类SampleApi.java
package com.practice.dev.rxjavasample.network.api;
import com.practice.dev.rxjavasample.model.SampleBean;
import java.util.List;
import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;
/** * Created by HY on 2017/4/13. */
public interface SampleApi {
@GET("search")
Observable<List<SampleBean>> search(@Query("q") String query);
}
3.请求方法写到一个NetWork.java文件中。
package com.practice.dev.rxjavasample.network;
import com.practice.dev.rxjavasample.network.api.SampleApi;
import okhttp3.OkHttpClient;
import retrofit2.CallAdapter;
import retrofit2.Converter;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/** * Created by HY on 2017/4/13. */
public class NetWork {
private static SampleApi sampleApi;
private static OkHttpClient okHttpClient = new OkHttpClient();
private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create();
private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJavaCallAdapterFactory.create();
public static SampleApi getZhuangbiApi() {
if (sampleApi == null) {
Retrofit retrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl("http://www.zhuangbi.info/")
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJavaCallAdapterFactory)
.build();
sampleApi = retrofit.create(SampleApi.class);
}
return sampleApi;
}
}
4.返回结果的bean类:
package com.practice.dev.rxjavasample.model;
/** * Created by HY on 2017/4/13. */
public class SampleBean {
public String description;
public String image_url;
}
5.最后是MainActivity的代码:
package com.practice.dev.rxjavasample;
import android.net.Network;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import com.practice.dev.rxjavasample.model.SampleBean;
import com.practice.dev.rxjavasample.network.NetWork;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import rx.Observer;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class MainActivity extends BaseActivity implements View.OnClickListener {
@Bind(R.id.piclist)
ListView piclist;
@Bind(R.id.search)
Button search;
private Subscription subscription;
private ListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
search.setOnClickListener(this);
adapter = new ListAdapter(this);
piclist.setAdapter(adapter);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.search:
show("可爱");
break;
}
}
private void show(String key) {
unsubscribe();
adapter.setImage(null);
subscription = NetWork.getZhuangbiApi()
.search(key)
.subscribeOn(Schedulers.io())//执行网络操作的线程
.observeOn(AndroidSchedulers.mainThread())//执行更新UI的线程
.subscribe(new Observer<List<SampleBean>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<SampleBean> sampleBean) {
adapter.setImage(sampleBean);
}
});
}
}
好啦,完整demo在这里下载:https://github.com/hiliving/RxJavaSample