用Mvp模式封裝一個Retrofit+Rxjava網絡請求

老樣子,代碼走起來!!!

首先需要一個Presenter的BaseActivity,之前這篇博客貼出過:

https://blog.csdn.net/Motejia/article/details/101364832

下面開始封裝使用:

首先在Activity繼承時候把自己寫的BasePresenter繼承了和Contract,VIew實現了

public class LogoActivity extends BaseActivity<LogoPresenter> implements LogoContract.View 

牢記一點,在onCreatPresenter方法裏要返回一個Presneter,不然不會訂閱,出來效果:

@Override
protected LogoPresenter onCreatePresenter() {
    return new LogoPresenter(this);
}

使用的時候在Activity裏用:

mPresenter.方法名即可;

開始Presenter的使用:

public class LogoPresenter extends LogoContract.Presenter {  

public LogoPresenter(LogoContract.View mView) {
    this.mView = mView;
    mModel = new LogoModel();
}
@Override
public void landLogin(String cardNo, String token) {
    Subscription subscribe = mModel.tokenLogin(cardNo, token)
            .subscribe(new Subscriber<String>() {

                @Override
                public void onStart() {
                    mView.showDialog();
                }

                @Override
                public void onCompleted() {
                    mView.hideDialog();
                }

                @Override
                public void onError(Throwable e) {
                    Log.e(TAG, e.getMessage());
                    onCompleted();
                }

                @Override
                public void onNext(String s) {
                    Log.e(TAG, s);
                }
            });
    addSubscribe(subscribe);
}
}

下面是Contrat部分:

public interface LogoContract {

//請求成功或者失敗的回調一些方法

interface View extends BaseView {

    void showDialog();

    void hideDialog();

    void toLandingSuccess(NewUserInfoBean.BodyBean bodyBean);
}

//Model層

interface Model extends BaseModel {

    Observable<String> landLogin(
            String cardNo,
            String password,
    );

}

//Presenter

abstract class Presenter extends BasePresenter<LogoContract.View, LogoContract.Model> {
    public abstract void landLogin(
            String cardNo,
            String token

    );

}

}

//Model接口

public class LogoModel implements LogoContract.Model {
@Override
public Observable<String> landLogin(String cardNo, String password, String vCode, String appId) {
    return ApiEngine.getInstance().getRsApiService()
            .getAppLogin(cardNo, password)
            .compose(RxSchedulers.<String>switchThread());
}

}

//封裝一個單例模式的ApiEgine類:

    private ApiEngine() {

        //日誌攔截器
//        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        //設置查看類別
//        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        LoggingInterceptor loggingInterceptor = new LoggingInterceptor();
        //設置緩存位置與緩存的大小
        int size = 1024 * 1024 * 100;
        File cacheFile = new File(App.getContext().getCacheDir(), "okHttpCache");
        Cache cache = new Cache(cacheFile, size);


        //添加日誌攔截器,並且添加網絡緩存,響應時間改爲了30s
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(30, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .addNetworkInterceptor(new NetWorkInterceptor())
                .addInterceptor(loggingInterceptor)
                .addInterceptor(new UrlPahtIntercepter())
                .cache(cache)
                .build();

        rsRetrofit = new Retrofit.Builder()
                .baseUrl("接口前綴")
                .client(client)

                .addConverterFactory(ScalarsConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

}

//將網絡請求對象封裝爲單例模式
public static ApiEngine getInstance() {
    if (apiEngine == null) {
        synchronized (ApiEngine.class) {
            if (apiEngine == null) {
                apiEngine = new ApiEngine();
            }
        }
    }
    return apiEngine;
}

//創建Retrofit

public ApiService getRsApiService() {

    return rsRetrofit.create(ApiService.class);
}

//在創建一個ApiService類用來寫接口,Retrofit註解自己看吧,不做解釋

@FormUrlEncoded
@POST("接口地址")
Observable<String> getAppLogin(
        @Field("cardNo") String cardNo,
        @Field("password") String password,
      
);

 

拷貝可用,使用至上!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章