MVP框架,retrofit网络框架封装,调用实现列表

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值