前言
本系列共三篇:
Android MVP入门到进阶之-简单入门
Android MVP入门到进阶之-结合Dagger2
Android MVP入门到进阶之- 系统框架集成(完结)
通过前两篇文章,整理了 MVP的简单框架的搭建 和 MVP结合Dagger2 的使用的例子,如果你还不熟悉MVP的使用请先查看前两篇文章:
Android MVP入门到进阶之-简单入门
Android MVP入门到进阶之-结合Dagger2
这篇文章我们我们主要介绍,MVP 配合网络框架Retrofit 的使用,因为我们APP开发,网络请求是很重要的一环,当然你也可以选择自己喜欢的网络框架进行封装。这里我们只讲解 Retrofit2 基于 Dagger2的封装和在MVP框架中的使用。
如果你还不知道什么事Retrofit是什么,你可能还需要补充一下知识
你真的会用Retrofit2吗?Retrofit2完全教程
正式开始
通过Android MVP入门到进阶之-结合Dagger2的封装之后,我们的主体框架已经定型,所以我们只需要添加一个HttpMoudle
就可以了,我们一步一步来添加
1. 在build.gradle中添加相关依赖
/*gson 用于解析json数据*/
implementation 'com.google.code.gson:gson:2.8.2'
/*retrofit 网络请求框架 + rxjava */
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
/*添加Gson适配器*/
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.0.0'
/*okhttp日志打印*/
implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'
/*rxjava*/
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.8'
2. 在AndroidManifest.xml 中添加网络权限
<!-- 用于访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
添加BaseApiService接口 用于管理网络请求接口和提供网络请求的方法
/**
* @desc BaseApiService 为Retrofit框架提供接口请求注解,也是我们的网络接口管理类
* @author Marlon
* @date 2018/12/18
*/
public interface BaseApiService {
String BASE_URL_ZHIHU = " http://news-at.zhihu.com/";
@GET("/api/4/version/android/2.3.0")
Observable<BaseResponse<Resond>> getVerisionRxjava();
}
书写HttpMoudel
/**
* @desc HttpModule
* @author Marlon
* @date 2017/12/18
*/
@Module
public class HttpModule {
private static final String TAG = "HttpModule";
private static final long TIMEOUT = 1000;
@Singleton
@Provides
//构建 Retrofit.Builder
Retrofit.Builder provideRetrofitBuilder() {
return new Retrofit.Builder();
}
@Singleton
@Provides
// 构建 OkHttpClient.Builder
OkHttpClient.Builder provideOkHttpBuilder() {
return new OkHttpClient.Builder();
}
@Singleton
@Provides
//构建 OkHttpClient 这里的拦截器 根据需求添加 需要才添加
OkHttpClient provideClient(OkHttpClient.Builder builder) {
CookieManger cookieJar =
new CookieManger(App.getInstance());
//储存目录
File mFile = new File(App.getInstance().getCacheDir() + "http");
// 10 MB 最大缓存数
long maxSize = 10 * 1024 * 1024;
Cache mCache = new Cache(mFile, maxSize);
Map<String, String> headers = new HashMap<>();
return builder
//添加Cookie管理,不需要管理可以不加,token在Cookie中的时候需要添加
.cookieJar(cookieJar)
//添加统一的请求头
.addInterceptor(new BaseInterceptor(headers))
//添加base改变拦截器
.addInterceptor(new BaseUrlInterceptor())
//添加缓存拦截器
.addNetworkInterceptor(new CaheInterceptor(App.getInstance()))
//打印请求信息(可以自定义打印的级别!!)
.addNetworkInterceptor(new HttpLoggingInterceptor(message -> Log.e(TAG, message)).setLevel(HttpLoggingInterceptor.Level.BODY))
//相关请求时间设置
//链接时间
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)
//读取时间
.readTimeout(TIMEOUT, TimeUnit.SECONDS)
//写入时间
.writeTimeout(TIMEOUT, TimeUnit.SECONDS)
//添加缓存
.cache(mCache)
// 这里你可以根据自己的机型设置同时连接的个数和时间,我这里8个,和每个保持时间为15s
.connectionPool(new ConnectionPool(8, 15, TimeUnit.SECONDS))
.build();
}
@Singleton
@Provides
//构建 Retrofit
Retrofit provideMyRetrofit(Retrofit.Builder builder, OkHttpClient client) {
return createRetrofit(builder, client, BaseApiService.BASE_URL_ZHIHU);
}
@Singleton
@Provides
//通过 反射机制 创建BaseApiService 这里BaseApiService 是封装请求方法的接口类
BaseApiService provideMyService(Retrofit retrofit) {
return retrofit.create(BaseApiService.class);
}
/**
* 通过Retrofit.Builder OkHttpClient url 构建Retrofit
* @param builder
* @param client
* @param url
* @return
*/
private Retrofit createRetrofit(Retrofit.Builder builder, OkHttpClient client, String url) {
return builder.baseUrl(url)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
}
上面构建OkHttpClient 的方法中涉及到很多的拦截器,详细内容请查看源码demo。
在 AppComponent中添加一下内容,将HttpModule 添加到注解中
/**
* @desc AppComponent
* @author Marlon
* @date 2018/12/18
*/
@Singleton
@Component(modules = {AppModule.class, HttpModule.class})
public interface AppComponent {
App getContext(); // 提供App的Context
BaseApiService retrofitHelper(); //提供http的帮助类
}
在APP中加入HttpModule 关联
/**
* @desc App
* @author Marlon
* @date 2018/12/18
*/
public class App extends Application {
private static App instance;
public static AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public static synchronized App getInstance() {
return instance;
}
public static AppComponent getAppComponent() {
if (appComponent == null) {
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(instance))
.httpModule(new HttpModule())//这里添加
.build();
}
return appComponent;
}
public static void exitApp() {
try {
ActivityCollector.removeAllActivity();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.exit(0);
}
}
}
书写 RxPresenter 类使用
/**
* @desc RxPresenter 基于Rx的Presenter封装,控制订阅的生命周期
* @author Marlon
* @date 2018/12/18
*/
public class RxPresenter<T extends BaseView> implements BasePresenter<T> {
protected BaseApiService apiService;
protected Context mContext;
protected T mView;
private CompositeDisposable mCompositeDisposable;
public RxPresenter(App mContext, BaseApiService apiService) {
this.apiService = apiService;
this.mContext = mContext;
}
/**
* 取消注册 中断请求
*/
protected void unSubscribe() {
if (mCompositeDisposable != null) {
mCompositeDisposable.dispose();
mCompositeDisposable.clear();
}
}
//注册
protected void addSubscribe(Disposable subscription) {
if (mCompositeDisposable == null) {
mCompositeDisposable = new CompositeDisposable();
}
mCompositeDisposable.add(subscription);
}
protected void addSubscribe(Observable<?> observable, BaseObserver observer) {
if (mCompositeDisposable == null) {
mCompositeDisposable = new CompositeDisposable();
}
mCompositeDisposable.add(observable.compose(RxHelper.io_main(mContext)).subscribeWith(observer));
}
@Override
public void attachView(T view) {
this.mView = view;
}
@Override
public void detachView() {
this.mView = null;
unSubscribe();
}
}
MainPresenter 继承 RxPresenter
/**
* @desc MainPresenter
* @author Marlon
* @date 2018/12/18
*/
public class MainPresenter extends RxPresenter<MainContract.View> implements MainContract.Presenter {
@Inject
public MainPresenter(App app, BaseApiService service) {
super(app, service);
}
@Override
public void getVersion() {
//使用方式一
addSubscribe(apiService.getVerisionRxjava()
.compose(RxHelper.io_main(mContext))
.subscribeWith(new BaseObserver<Resond>() {
@Override
protected void onSuccess(Resond value) {
mView.showData(value.toString());
}
@Override
protected void onFailure(String message) {
mView.showData(message);
}
}));
//使用方式二
addSubscribe(apiService.getVerisionRxjava(), new BaseObserver<Resond>() {
@Override
protected void onSuccess(Resond value) {
}
@Override
protected void onFailure(String message) {
}
});
}
}
总结
到这里 我们框架就完全封装完成,可能你看到这里还很迷,确实我刚开始学的时候也很迷,所以你需要把
RxJava 2、Retrofit2、Dagger2 ,慢慢搞懂,然后照着demo写一遍,理解一下,应该还是不难,感觉用文字叙述实在是不好写,如果有疑问,也可以留言哈,我明白的可以答疑。
本文源码地址demo,如果对你有帮助,希望点一下小星星哈!
到此,我们MVP框架系列已经完结了。。。后面可能回再写一篇结合组件化的博客,以后再说吧。
本文章为原创博客,转载请注明出处!