MVP框架
数据
MVP层
创建model view 以及presenter层级显示
实现分层数据获取view需要更新UI通知presenter,P通知model获取数据,
回传到P,P通知view更新
各层级代码片段按图片顺序展示
package com.example.lib.mvp.model;
public class BaseModel implements IModel {
@Override
public void destory() {
}
}
public interface IModel {
void destory();
}
package com.example.lib.mvp.presenter;
import com.example.lib.mvp.model.IModel;
import com.example.lib.mvp.view.IView;
public class BasePresenter<M extends IModel,V extends IView> implements IPresenter {
protected M mModel;
protected V mView;
public BasePresenter(M mModel, V mView) {
this.mModel = mModel;
this.mView = mView;
}
@Override
public void destory() {
if(mModel!=null){
mModel.destory();
mModel=null;
}
if(mView!=null){
mView=null;
}
System.gc();
}
}
package com.example.lib.mvp.presenter;
public interface IPresenter {
void destory();
}
package com.example.lib.mvp.view;
import android.os.Bundle;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.example.lib.mvp.presenter.IPresenter;
public abstract class BaseActivity<P extends IPresenter> extends AppCompatActivity implements IView,IActivity {
protected P mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(bindLayout());
initView();
initData();
}
@Override
public void showToast(String s) {
Toast.makeText(this, ""+s, Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mPresenter!=null){
mPresenter.destory();
mPresenter=null;
}
}
}
package com.example.lib.mvp.view;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import com.example.lib.mvp.presenter.IPresenter;
public abstract class BaseFragment <P extends IPresenter> extends Fragment implements IView,IFragment {
protected P mPresenter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View inflate = inflater.inflate(bindLayout(), null);
return inflate;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView();
initData();
}
@Override
public void onDestroy() {
super.onDestroy();
if(mPresenter!=null){
mPresenter.destory();
mPresenter=null;
}
}
}
package com.example.lib.mvp.view;
public interface IActivity {
int bindLayout();
void initView();
void initData();
}
package com.example.lib.mvp.view;
public interface IFragment extends IActivity {
}
package com.example.lib.mvp.view;
public interface IView {
void showToast(String s);
}
HTTP层
HTTP层是通过网络框架获取数据的地方从外部调用来获取数据
相关代码片段按图片层级顺序展示
package com.example.lib.http.product;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class DefRetrofitImpl implements IRetrofitProduct{
Retrofit retrofit;
@Override
public Retrofit retrofit() {
if(retrofit==null){
retrofit=new Retrofit.Builder()
.baseUrl("http://www.qubaobei.com/")
.client(new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.writeTimeout(2, TimeUnit.MINUTES)
.readTimeout(2, TimeUnit.MINUTES)
.connectTimeout(2, TimeUnit.MINUTES)
.build()
)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
package com.example.lib.http.product;
import retrofit2.Retrofit;
public interface IRetrofitProduct {
Retrofit retrofit();
}
package com.example.lib.http.product;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class NetworkRetrofitImpl implements IRetrofitProduct{
Retrofit retrofit;
@Override
public Retrofit retrofit() {
if(retrofit==null){
retrofit=new Retrofit.Builder()
.baseUrl("")
.client(new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.writeTimeout(2, TimeUnit.MINUTES)
.readTimeout(2, TimeUnit.MINUTES)
.connectTimeout(2, TimeUnit.MINUTES)
.build()
)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
package com.example.lib.http.product;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class UploadRetrofitImpl implements IRetrofitProduct{
Retrofit retrofit;
@Override
public Retrofit retrofit() {
if(retrofit==null){
retrofit=new Retrofit.Builder()
.baseUrl("")
.client(new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.writeTimeout(2, TimeUnit.MINUTES)
.readTimeout(2, TimeUnit.MINUTES)
.connectTimeout(2, TimeUnit.MINUTES)
.build()
)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
package com.example.lib.http;
public enum ERetrofitType {
DEF,NEWWORK,UPLOAD
}
package com.example.lib.http;
import com.example.lib.http.product.IRetrofitProduct;
public interface IRetrofitFactory {
IRetrofitProduct cteate(ERetrofitType type);
}
package com.example.lib.http;
import com.example.lib.http.product.DefRetrofitImpl;
import com.example.lib.http.product.IRetrofitProduct;
import com.example.lib.http.product.NetworkRetrofitImpl;
import com.example.lib.http.product.UploadRetrofitImpl;
public class RetrofitFactory implements IRetrofitFactory {
DefRetrofitImpl defRetrofit;
NetworkRetrofitImpl networkRetrofit;
UploadRetrofitImpl uploadRetrofit;
@Override
public IRetrofitProduct cteate(ERetrofitType type) {
switch (type){
case UPLOAD:
if(uploadRetrofit==null){
uploadRetrofit=new UploadRetrofitImpl();
}
return uploadRetrofit;
case NEWWORK:
if(networkRetrofit==null){
networkRetrofit=new NetworkRetrofitImpl();
}
return networkRetrofit;
default:
case DEF:
if(defRetrofit==null){
defRetrofit=new DefRetrofitImpl();
}
return defRetrofit;
}
}
private volatile static RetrofitFactory retrofitFactory;
public static synchronized RetrofitFactory getInstance(){
if(retrofitFactory==null){
retrofitFactory=new RetrofitFactory();
}
return retrofitFactory;
}
}
db层
暂未编写
项目调用MVP获取数据
constract
package com.example.day_3_19_mvp.mvp.constract;
import com.example.day_3_19_mvp.utils.FoodBean;
import com.example.lib.mvp.model.IModel;
import com.example.lib.mvp.view.IView;
import java.util.List;
import io.reactivex.Observer;
public interface FoodConstract {
interface getFoodModel extends IModel{
void getModel(Observer<FoodBean> observer);
}
interface getFoodView extends IView{
void getView(List<FoodBean.DataBean> list);
}
}
presenter
package com.example.day_3_19_mvp.mvp.presenter;
import com.example.day_3_19_mvp.mvp.constract.FoodConstract;
import com.example.day_3_19_mvp.utils.FoodBean;
import com.example.lib.mvp.presenter.BasePresenter;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
public class FoodPresenter extends BasePresenter<FoodConstract.getFoodModel,FoodConstract.getFoodView> {
public FoodPresenter(FoodConstract.getFoodModel mModel, FoodConstract.getFoodView mView) {
super(mModel, mView);
}
public void getData(){
mModel.getModel(new Observer<FoodBean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(FoodBean foodBean) {
mView.getView(foodBean.getData());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}
model
package com.example.day_3_19_mvp.mvp.model;
import com.example.day_3_19_mvp.mvp.constract.FoodConstract;
import com.example.day_3_19_mvp.utils.Api;
import com.example.day_3_19_mvp.utils.FoodBean;
import com.example.lib.http.ERetrofitType;
import com.example.lib.http.RetrofitFactory;
import com.example.lib.mvp.model.BaseModel;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class FoodModel extends BaseModel implements FoodConstract.getFoodModel {
// RetrofitFactory retrofitFactory;
@Override
public void getModel(Observer<FoodBean> observer) {
// retrofitFactory = new RetrofitFactory();
// Retrofit retrofit = new Retrofit.Builder()
// .baseUrl("http://www.qubaobei.com/")
// .addConverterFactory(GsonConverterFactory.create())
// .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
// .build();
// Api api = retrofit.create(Api.class);
// api.obser()
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(observer);
//调用单例工厂类实例
//调用枚举方法
//实现接口完成数据存储
RetrofitFactory retrofitFactory = new RetrofitFactory();
Retrofit retrofit1 = retrofitFactory.cteate(ERetrofitType.DEF).retrofit();
retrofit1.baseUrl();
Api api1 = retrofit1.create(Api.class);
api1.obser()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}
页面调用实现
这里使用的是fragment
package com.example.day_3_19_mvp.fragment;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.example.day_3_19_mvp.R;
import com.example.day_3_19_mvp.adapter.FoodAdapter;
import com.example.day_3_19_mvp.mvp.constract.FoodConstract;
import com.example.day_3_19_mvp.mvp.model.FoodModel;
import com.example.day_3_19_mvp.mvp.presenter.FoodPresenter;
import com.example.day_3_19_mvp.utils.FoodBean;
import com.example.lib.mvp.view.BaseFragment;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
*/
public class BlankFragment extends BaseFragment implements FoodConstract.getFoodView {
private RecyclerView re;
@Override
public void getView(List<FoodBean.DataBean> list) {
FoodAdapter foodAdapter = new FoodAdapter(R.layout.item, list);
re.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));
re.setAdapter(foodAdapter);
}
@Override
public int bindLayout() {
return R.layout.fragment_blank;
}
@Override
public void initView() {
re = (RecyclerView) getActivity().findViewById(R.id.re);
}
@Override
public void initData() {
FoodPresenter foodPresenter = new FoodPresenter(new FoodModel(), this);
foodPresenter.getData();
}
@Override
public void showToast(String s) {
Toast.makeText(getContext(), ""+s, Toast.LENGTH_SHORT).show();
}
}
最后效果展示
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210319193107280.png?x-oss-process=image/watermark,type_ZmFuZ
3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpZ2h0MDI=,size_16,color_FFFFFF,t_70)