老樣子,代碼走起來!!!
首先需要一個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, );
拷貝可用,使用至上!!