当下,Rxjava + Retrofit + MVP是Android开发最流行,使用最多的框架了,替代了原来的OKhttp + MVC的模式,但是好处在哪呢。其实Retrofit是在Okhttp的基础上发展而来的网络请求框架,区别不是很大,但是跟RxAndroid配合使用就能发挥其威力了。
1、首先导入依赖
//rxjava依赖
implementation 'io.reactivex.rxjava2:rxjava:2.2.4'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
//retrofit依赖
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
//okhttp依赖
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
//okhttp日志拦截器
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.1'
//butterknife注解依赖
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
Activity代码
public class MainActivity extends AppCompatActivity {
@BindView(R.id.textView)
TextView textView;
TextPresenter textPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);//绑定
//创建p层
textPresenter = new TextPresenter(new TextCall());
//发送请求
textPresenter.request();
}
class TextCall implements DataCall<Result<List<BannerData>>>{
@Override
public void success(Result<List<BannerData>> data) {
List<BannerData> dataData = data.getData();
textView.setText(dataData.get(1).getTitle());
}
@Override
public void fial(Throwable throwable) {
Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
textPresenter.unbind();//防止内存泄漏
}
}
IResult请求接口,代替了model层
public interface IResult{
@GET("ad/getAd")//加入接口中需要改变的部分
Observable<Result<List<BannerData>>> banner();
}
BasePresenter
public abstract class BasePresenter {
DataCall dataCall;
public BasePresenter(DataCall dataCall) {
this.dataCall = dataCall;
}
public abstract Observable observable(Object...args);
public void request(Object...args){
observable(args).subscribeOn(Schedulers.newThread()) //将请求调度到子线程
.observeOn(AndroidSchedulers.mainThread()) //将结果调度到主线程
.subscribe(new Consumer<Result>() {
@Override
public void accept(Result result) throws Exception {
dataCall.success(result);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
dataCall.fial(throwable);
}
});
}
public void unbind(){
dataCall = null;
}
}
presenter继承Basepresenter
public class TextPresenter extends BasePresenter{
public TextPresenter(DataCall dataCall) {
super(dataCall);
}
@Override
public Observable observable(Object... args) {
IResult iResult = NetWork.getInstance().create(IResult.class);
return iResult.banner();
}
}
工具类
public class NetWork {
private String base_url = "http://www.zhaoapi.cn/";//必须以"/"结尾
public static NetWork instance;
private Retrofit retrofit;
public static NetWork getInstance(){
if (instance == null) {
instance = new NetWork();
}
return instance;
}
//设置成私有属性
private NetWork() {
init();
}
private void init() {
//创建日志拦截器
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
//okhttp
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.writeTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.build();
//retrofit+RxJava
retrofit = new Retrofit.Builder()
.baseUrl(base_url)
.client(okHttpClient)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
public <T> T create(final Class<T> service) {
return retrofit.create(service);
}
}
View层
public interface DataCall<T> {
void success(T data);
void fial(Throwable throwable);
}