Mvp框架的使用
2020-09-23 本文已影响0人
HOLLE_karry
MVP 使用文档
导入
将MVP资源包导入
在settings.gradle设置如下目录
rootProject.name='Test'
include ':app'
include ': mvplib '
include ' : mvplib:libMvpAnotation:compiler '
在 app build.gradle
implementation project(path: ':mvplib')
annotationProcessor project(path: ':mvplib:libMvpAnotation:compiler')
注释: compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
必须使用java8依赖
必须导入version.gradlee
使用
注释使用
@MvpEntity
使用该注解得到从服务器beam类(这里要特别注意code值)
@MvpEntity
public class HttpResult<T> implements IMvpEntity<T> {
/**
* 'code': '1',
* 'message': '成功提示',
* 'data':
*/
private int code;
private String message;
private T data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
@Override
public boolean isOk() {
//每个服务器返回的code值
return code == 1 && data != null;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
@OkInterceptor(1)
添加自定义ok拦截器
@OkInterceptor(1)//括号里代表OK连接器的等级
public class Intercepter1 implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
return chain.proceed(chain.request());
}
}
@ApiService
自定义ApiService
@ApiService
public interface AppApiService {
@POST()
Observable<HttpResult<User>> getUser(@FieldMap HashMap<String, Object> map);
}
@BaseUrl
自定义BaseUrl
public interface Constrant {
@BaseUrl
String BASE_URL = "https://www.seetao.com";
}
设置请求params
public class MvpApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
MvpManager.setParamsGetter(ParamsUtils::getCommonParams);
}
}
自定义解析GsonFactory
@GsonConverter
public class JDGsonConverterFactory extends MvpGsonConverterFactory {
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new JDGsonResponseBodyConverter<>(gson, adapter,type);
}
}
/**
* 继承BaseSmartFragment1<>范型返回需要的解析的数据
*/
public class JDGsonResponseBodyConverter<T> extends MvpGsonResponseBodyConverter<T> {
public JDGsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter, Type type) {
super(gson, adapter, type);
}
@Override
public String handJson(String json) {
try {
JSONObject jsonObject = new JSONObject(json);
if(!jsonObject.isNull("code")){
int code = jsonObject.getInt("code");
if(code != 1){ // 失败
if(!jsonObject.isNull("data")){
String data = jsonObject.getString("data");
if(TextUtils.isEmpty(data)){ // 如果 data 是一个空字符串
jsonObject.remove("data");
return jsonObject.toString();
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return json;
}
}
使用
ONE 继承BaseSmartFragment1
使用在Fragment页面
public class VideoFragment extends BaseSmartFragment1<VideoBean> {
/**
*
* @return
* 返回该类所在xml布局
*/
@Override
protected int getLayoutId() {
return R.layout.fragment_video;
}
/**
*
* @param data
* 接受成功bean类
*/
@Override
public void onResult1(MvpResponse<VideoBean> data) {
if (data.getCode() == 1) {
Toast.makeText(getActivity(), data.getData().getList().get(1).getShare_link(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), data.getMsg(), Toast.LENGTH_SHORT).show();
}
}
/**
* 1.创建请求对象如果是
* 范型中添加得到bean类
* Get请求创建GetRequest
* Post请求创建PostRequest
* 2.如果有参数调用
* request.setParams();设置参数
*3.调用请求方法
* doRequest(request);
*/
@Override
protected void initView() {
super.initView();
GetRequest<VideoBean> request = new GetRequest<>("/app/v_1_6/article/videolist");
doRequest(request);
}
/**
*
* @param view
* 绑定View
*/
@Override
protected void bindView(View view) {
super.bindView(view);
}
TWO(在p层处理逻辑)
重写p层
创建契约类
创建Presenter继承IBasePresenter
创建View继承IBaseView
public interface ConstrantVideo {
// 创建P层继承IBasePresenter
interface IVideoPresenter extends IBasePresenter<IVideoView> {
//p传递数据方法
void getVideoData();
}
// 创建View契约类
interface IVideoView extends IBaseView<ConstrantVideo.IVideoPresenter> {
void onSucces(Video video);
void onFail(String error);
void onNetError();
void showLoadLing();
void closeLoadLing();
}
}
创建P层
BaseRepository创建model成员变量在P层构造方法通过new BaseRepository()得到model实例
在P层方法中根据请求Url 创建GetRequest或者PostRequest对象
如果有参数设置请求参数
通过model对象调用mModel.doRequest(request,new IBaseCallBack<T>{})获得数据
public class VideoPresenter extends BasePresenter<ConstrantVideo.IVideoView> implements ConstrantVideo.IVideoPresenter {
private BaseRepository mModel;
private CompositeDisposable mCompositeDisposable = new CompositeDisposable();
public VideoPresenter() {
mModel = new BaseRepository();
}
@Override
public void getVideoData() {
// 给请求对象添加参数
GetRequest request = new GetRequest("/app/v_1_6/article/videolist");
// 设置请求参数
request.setParams(ParamsUtils.getCommonParams());
request.setType(Video.class);
// 加载动画
mView.showLoadLing();
mModel.doRequest(request, new IBaseCallBack<Video>() {
// 切断cut方法
@Override
public void onCut(Disposable disposable) {
mCompositeDisposable.add(disposable);
}
// 获取结果
@Override
public void onResult(MvpResponse<Video> data) {
if (data.getCode() == 1) {
mView.onSucces(data.getData());
mView.closeLoadLing();
} else {
mView.onFail(data.getMsg());
}
}
});
}
@Override
public boolean cancelRequest() {
return true;
}
}
Fragmenrt
继承BaseMvpFragment<T extend IBasePresenter>implements具体的View
在成功失败方法得到数据
public class VideoFragmenrt extends BaseMvpFragment<ConstrantVideo.IVideoPresenter> implements ConstrantVideo.IVideoView {
@Override
protected int getLayoutView() {
return R.layout.fragment_video_fragmenrt;
}
@Override
public void onSucces(Video video) {
toast(video.getList().get(2).getShare_link());
}
@Override
public void onFail(String error) {
toast(error);
}
@Override
public void onNetError() {
toast("网络错误");
}
@Override
public void showLoadLing() {
showPopLoading();
}
@Override
public void closeLoadLing() {
closeLoading();
}
@Override
public ConstrantVideo.IVideoPresenter creatPresenter() {
return new VideoPresenter();
}
@Override
protected void initView() {
mPresenter.getVideoData();
}
}
Three(在model层做数据缓存)
重写model层
在Fragment
//重写createPresenter 返回自定义的model 层
@Override
public BaseSmartPresenter1<RecommendData, ?> createPresenter() {
return new BaseSmartPresenter1<>(RecommondRepository.getInstance());
}
重写model
public class RecommondRepository extends BaseRepository {
private static final String CACHE_FILE_NAME_PREFIX = "version_code";
private static RecommondRepository mInstance;
private HashMap<String, RecommendData> mMemoryData = new HashMap<>();
/**
*
* @return
* 单例是的只有一个model对象
*/
public static RecommondRepository getInstance() {
// 判断对象是否创建
if (mInstance == null) {
// 在此处创建线程索让其他线程减少等待时间
synchronized (RecommondRepository.class) {
// 如果线程1拿到锁对象未创建完成,线程2拿到锁创建完对象线程1继续创建此时对象已经通过线程2实例化所以进行二次判空
if (mInstance == null) {
// 创建对象
mInstance = new RecommondRepository();
}
}
}
return mInstance;
}
@Override
public <T> void doRequest(LifecycleProvider lifecycleProvider, MvpRequest<T> request, IBaseCallBack<T> callBack) {
/*取数据*/
// 不调用父类的方法,重写子类
// super.doRequest(lifecycleProvider, request, callBack);
// 得到栏目ID
String columnId = request.getParams().get(Constract.RequestKey.KEY_COLUMN_ID).toString();
switch (request.getRequestType()) {
// case加入括号{}可以重复创建变量局部变量只能在方法里有效
/**
* 默认都是第一次请求
* 刷新和加载更多都不需要读取缓存数据
*/
case FIRST: {
// step1.先从内从存查找直接传入P层
MvpResponse response = getFromMemory(columnId);
if (response != null) {
callBack.onResult(response);
return;
}
// step2.如果内存没有直接从sdcard读取
/*
*Observable 内置线程池节省系统开销
* scared都为耗时操作为 */
Observable.create(new ObservableOnSubscribe<MvpResponse>() {
@Override
public void subscribe(@NonNull ObservableEmitter<MvpResponse> emitter) throws Throwable {
MvpResponse fromSdCard = getFromSdCard(columnId);
if (fromSdCard != null) {
emitter.onNext(fromSdCard);
emitter.onComplete();
} else {
emitter.onError(new NullPointerException("sdcard no data"));
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<MvpResponse>() {
@Override
public void accept(MvpResponse mvpResponse) throws Throwable {
callBack.onResult(mvpResponse);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Throwable {
doRequest(lifecycleProvider, request, callBack, new CacheTask<>(request));
}
});
break;
}
default:{
// 从服务请求
doRequest(lifecycleProvider,request,callBack,new CacheTask<>(request));
}
}
}
// 读取内存数据
private MvpResponse getFromMemory(String key) {
// 看内存是否有该数据
RecommendData data = mMemoryData.get(key);
if (data != null) {
// 设置数据
MvpResponse<RecommendData> response = new MvpResponse<>();
return response.setData(data).setCode(1).setRequestType(RequestType.FIRST).setType(ResponseType.MEMORY);
}
return null;
}
/**
* @param key
* @return 从sd卡读取文件
*/
private MvpResponse getFromSdCard(String key) {
// 从内存卡读取数据
RecommendData data = MvpDataFileCacheUtils.getencryptedDataFromFile(getCacheDataSdcardFile(key), RecommendData.class);
if (data != null) {
MvpResponse<RecommendData> response = new MvpResponse<>();
return response.setCode(1).setData(data).setType(ResponseType.SDCARD);
}
return null;
}
/**
* @param columnId
* @return 创建手机文件
*/
// 找到文件
private File getCacheDataSdcardFile(String columnId) {
return new File(MvpManager.getExternalCacheDir(), CACHE_FILE_NAME_PREFIX + columnId);
}
// 缓存数据
private class CacheTask<T> implements Consumer<MvpResponse<T>> {//实现做缓存接口
private MvpRequest request;
CacheTask(MvpRequest request) {
this.request = request;
}
@SuppressWarnings("ALL")
@Override
public void accept(MvpResponse<T> mvpResponse) throws Throwable {
// 得到保存的Key值
String key = request.getParams().get(Constract.RequestKey.KEY_COLUMN_ID).toString();
saveToMemory((MvpResponse<RecommendData>) mvpResponse, request.getRequestType(), key);
saveToSdcard((MvpResponse<RecommendData>) mvpResponse, key);
}
// 保存到card
private void saveToSdcard(MvpResponse<RecommendData> mvpResponse, String key) {
}
// 保存到内存
private void saveToMemory(MvpResponse<RecommendData> mvpResponse, RequestType requestType, String key) {
if (requestType != RequestType.LOAD_MORE){//不是加载更多
mMemoryData.clear();//将内存设置空
RecommendData recommendData = new RecommendData();//创建空对象开辟内存
RecommendData serverData = mvpResponse.getData();//从网络获取data
// 设置数据
recommendData.setAlbumId(serverData.getAlbumId());
recommendData.setAlbumNews(serverData.getAlbumNews());
recommendData.setAlbumTitle(serverData.getAlbumTitle());
recommendData.setBannerList(serverData.getBannerList());
recommendData.setFlashId(serverData.getFlashId());
recommendData.setFlashNews(serverData.getFlashNews());
recommendData.setMore(serverData.getMore());
recommendData.setPointTime(serverData.getPointTime());
recommendData.setStart(serverData.getStart());
recommendData.setNews(new ArrayList<>(serverData.getNews()));
// 缓存到集合
mMemoryData.put(key,recommendData);
}else {
RecommendData cacheData = mMemoryData.get(key);//获取缓存加入数据
RecommendData serverData = mvpResponse.getData();//获取网络数据
// 如果网络数据和缓存数据都不为空
if(cacheData != null && serverData != null){
// 所有数据只有新闻数据需要实施gen新
cacheData.setStart(serverData.getStart());
cacheData.setNumber(serverData.getNumber());
cacheData.setPointTime(serverData.getPointTime());
cacheData.setMore(serverData.getMore());
cacheData.getNews().addAll(serverData.getNews());
}
}
}
}
}