老样子,代码走起来!!!
首先需要一个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, );
拷贝可用,使用至上!!