Android MVP入门到进阶之- 系统框架集成(完结)

前言

本系列共三篇:
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 中添加网络权限

    
    
    

添加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> 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 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 implements BasePresenter {
    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 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() {
                    @Override
                    protected void onSuccess(Resond value) {
                        mView.showData(value.toString());
                    }


                    @Override
                    protected void onFailure(String message) {
                        mView.showData(message);
                    }
                }));
        //使用方式二
        addSubscribe(apiService.getVerisionRxjava(), new BaseObserver() {

            @Override
            protected void onSuccess(Resond value) {

            }

            @Override
            protected void onFailure(String message) {

            }
        });
    }
}

总结

到这里 我们框架就完全封装完成,可能你看到这里还很迷,确实我刚开始学的时候也很迷,所以你需要把
RxJava 2、Retrofit2、Dagger2 ,慢慢搞懂,然后照着demo写一遍,理解一下,应该还是不难,感觉用文字叙述实在是不好写,如果有疑问,也可以留言哈,我明白的可以答疑。
本文源码地址demo,如果对你有帮助,希望点一下小星星哈!
到此,我们MVP框架系列已经完结了。。。后面可能回再写一篇结合组件化的博客,以后再说吧。

本文章为原创博客,转载请注明出处!

你可能感兴趣的:(Android MVP入门到进阶之- 系统框架集成(完结))