0.前言
最近的Rxjava+retrofit+okhttp+mvp十分火爆,我也抛弃了以前的框架,加入到Rx大军当中,在网络上翻找了一大推资料,看过无数教程文章,Crach很多次,现在才勉强搭建出自己的小框架,以登陆为小例子,下面给大家简单地讲解下整个框架的实现流程。
1.导包
这个导包必须注意一点,被坑了很多次,因为他版本号需要一致,否则会报些奇怪的错误
//retrofit和rxjava 使用所需导的包
compile'com.squareup.retrofit2:retrofit:2.0.0-beta3'
compile'io.reactivex:rxjava:1.0.1'
compile'io.reactivex:rxandroid:1.0.1'
compile'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' //用于Retroid设置addCallAdapterFactory
compile'com.squareup.retrofit2:converter-scalars:2.0.0-beta4' //用于Retroid设置addConverterFactory,这个是String转换,总共有7个选择,有Gson,XML等等,根据自己需要导入
compile'com.squareup.okhttp3:okhttp:3.3.1'
compile'com.squareup.okhttp3:logging-interceptor:3.3.1' //OKHTTP设置日志级别
2.权限
- 在注册清单中添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
3.项目结构
标准的MVP架构,这里对MVP就不多说,MVP的逻辑比较简单,主要思想就是通过接口实现各个层之间的解耦。
4.OkHttp与Retrofit的配置与简单使用
- 建立ApiService.class
/**
*配置请求参数的接口
*/
public interface ApiService
{
@GET("webservice/Base/UserInfo.asmx/Login6") //GET请求
Observable<String> logining(@Query("username") String username, @Query("password") String password); //传入username 、password两个参数.
}
这里你需要学习Retrofit的操作符,才能够灵活运用起来,这里举个简单的get请求的例子
- 建立Api.class
1.配置OKhttp(设置请求超时时间,配置请求头部信息。。。等)。
2.配置Retrofit(关联OkHttp,添加数据转换器,添加Base的URL。。。等)
3.建立apiService,将Retrofit 与ApiService接口连接起来。
4.提供单例的retrofit的service。
public class Api {
//单例模式获取ApiService
private volatile static Api INSTANCE;
private final ApiService apiService;
//头部验证信息
Interceptor headerInterceptor =new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request build = chain.request().newBuilder()
.addHeader("Content-Type", "application/x-www-form-urlencoded")//配置头部信息
.build();
return chain.proceed(build);
}
};
private Api(){
//配置OKhttp请求参数
OkHttpClient okHttp= new OkHttpClient.Builder()
.readTimeout(7676, TimeUnit.MILLISECONDS)
.connectTimeout(7676, TimeUnit.MILLISECONDS)
.addInterceptor(headerInterceptor) //添加头部信息
.build();
Retrofit retrofit = new Retrofit.Builder()
//关联OKhttp
.client(okHttp)
//设置请求回来的数据为Gson
//.addConverterFactory(GsonConverterFactory.create())
//设置service接口可以作为Observable返回
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//设置请求回来的数据为String,可以添加其他的适配器Gson.xml等7种,自动转化
.addConverterFactory(ScalarsConverterFactory.create())
//添加基础url
.baseUrl("http://"+"192.168.10.66:8081/")
.build();
//建立apiService
apiService = retrofit.create(ApiService.class);
}
/**
* 单例模式获取网络请求基类retrofit的service
* @return 单例ApiService
*/
public static ApiService getInstance() {
if (INSTANCE == null) {
synchronized (Api.class) {
if (INSTANCE == null) {
INSTANCE = new Api();
}
}
}
return INSTANCE.apiService;
}
}
5.应用于简单登陆
1.View层代码就不全贴出来了,都是简单的界面。只贴出点击登陆的View层实现代码
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
KLog.d("点击了登陆");
mPresenter.login(); //调用P层的login方法
}
});
2.Presenter层的login方法实现代码如下
@Override
void login() {
LoginModel loginModel = new LoginModel();//创建Model层的实类
//调用Model层的loginGet方法
//RxSubscriber是我自定的网络请求处理,不自己处理可以Subscriber即可。
loginModel.loginGet(mView.getUserName(),mView.getPwd()).subscribe(new RxSubscriber<LoginUserBean>(mContext,true) {
@Override
protected void _onNext(LoginUserBean loginUserBean) {
KLog.d("登陆成功");
}
@Override
protected void _onError(String message) {
KLog.d("登陆失败");
}
});
}
3.Model层代码实现如下
public class LoginModel {
//返回Observable,是为了给Presenter进行链式编程,可以监控成功失败
public Observable<LoginUserBean> loginGet(String username, String pwd){
//调用Api类获取serverce进行Apiservice定义的接口进行请求。
//MyFunc1是我自定义的一个类型属于处理类,你也可以自定义该类进行数据的处理
return Api.getInstance().logining(username,pwd).map(new MyFunc1<LoginUserBean>() {
@Override
public Class<LoginUserBean> setBeanClass() {
return LoginUserBean.class;
}
}).subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread());
}
}
6.总结
以上就是简单的Rxjava+retrofit+okhttp+mvp使用,哪方面不是很明白,最好是去翻阅该方面的文章获取知识即可。
下面提供一些个人觉得获益匪浅的文章
1.Rxjava:
给 Android 开发者的 RxJava 详解。
关于RxJava最友好的文章。
2.Retrofit
Retrofit用法详解
当Rxjava遇到Retrofit