Android T-Mvp的搭建 retrofit+RxJava一带封装!

接触到MVP模式已经挺长时间了,好几个月前T-MVP我就看到了,觉得挺有想法的,从中加入了retrofit+RxJava希望能懂。于是直接就用到了这次项目里,希望能够喜欢!

大家都知道MVP模式都有的几个接口Model,View,Presenter,另外还有一个用于用于存放这几个接口Contract契约类。

本文建议对mvp有所了解的人看  说的不详细希望见解  本人就是喜欢存储  以便来日看看!

首先自定义一个契约类后面必须以Contract结束!

先加一个网络缓存的工具类

public class MyRxCache {
    private static volatile MyRxCache myRxCache;
    private Cache ch;
    private static OkHttpClient build;

    private MyRxCache() {
    }

    public OkHttpClient build(Context context) {

        return getCache(context);
    }

    public static MyRxCache Builder() {
        if (null == myRxCache) {
            synchronized (MyRxCache.class) {
                if (null == myRxCache) {
                    myRxCache = new MyRxCache();
                }
            }
        }
        return myRxCache;
    }

    private  OkHttpClient getCache(Context context) {

        final Cache ch = new Cache(new File(context.getCacheDir(), "ch"), 10240 * 1024);
        return new OkHttpClient.Builder().cache(ch).addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request build = chain.request().newBuilder().cacheControl(new CacheControl.Builder().maxStale(2, TimeUnit.HOURS).build()).build();
                return chain.proceed(build);
            }
        }).build();

    }

ApiServer类

public interface ApiServer {
    @GET
    Observable<MeiTuBean> getMeiTu(@Url String url);
    @GET
    Observable<XinWenBean> getXinWen(@Url String url);

    @FormUrlEncoded
    @POST("affsdfsdf")
    Observable<XinWenBean> ggetpostxinwen(@FieldMap Map<String,String> map);
}
Conarict  Url地址类
public class Conarict {
public static final String URL="http://c.m.163.com/nc/article/headline/T1348647909107/0-20.html";
public static final String BASEURL="http://c.m.163.com/nc/article/headline/T1348647909107/";

public static final String MEITUURL="http://gank.io/api/data/%E7%A6%8F%E5%88%A9/20/1";
public static final String MEITUBASEURL="http://gank.io/api/data/%E7%A6%8F%E5%88%A9/20/";

public static final String XINWENURL="http://v.juhe.cn/toutiao/index?  type=top&key=d7ebf452b17acbf198dfcf7c24d4c6f9";
}

HomeContract类

Context 是一个网络缓存
public class HomeContract {

    public  interface View extends BaseView {
      //一次网络请求写一个方法
      void MeiTu(MeiTuBean meiTuBean);
      void XinWen(XinWenBean xinWenBean);
      //POST请求
      void PostXinWen(XinWenBean xinWenBean);

    }

    public interface Model extends BaseModel {
        rx.Observable<MeiTuBean> getMMeiTu(String url, Context context);
        rx.Observable<XinWenBean> getMXinWen(String url, Context context);
        rx.Observable<XinWenBean> getPostMXinWen(Map<String,String> map, Context context);

    }

    public abstract static class Presenter extends BasePresenter<Model, View> {
        
        public abstract void getPMeiTu(String url,Context context);
        public abstract void getPXinWen(String url,Context context);
        public abstract void getPostPXinWen(Map<String,String> map,Context context);


    }
}

BaseView类

public interface BaseView {
    //请求失败返回的方法
    void Shi(String string);
}

BaseModel类

public interface BaseModel {
   //Get请求加网络缓存
    ApiServer getBasemodel(Context context);
//POST
    ApiServer getPostBasemodel(Context context,String baseurl);
}

HomeModel类

public class HomeModel implements HomeContract.Model {
//GET
    @Override
    public ApiServer getBasemodel(Context context) {
       return new Retrofit.Builder()
                .client(MyRxCache.Builder().build(context))
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .baseUrl(Conarict.MEITUBASEURL)
                .build().create(ApiServer.class);
    }
    //POST
    @Override
    public ApiServer getPostBasemodel(Context context,String baseurl) {
        return new Retrofit.Builder()
                .client(MyRxCache.Builder().build(context))
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .baseUrl(baseurl)
                .build().create(ApiServer.class);
    }//GET
    @Override
    public Observable<XinWenBean> getMXinWen(String url, Context context) {
        return getBasemodel(context)
                .getXinWen(url);
    }
    //POST
    @Override
    public Observable<XinWenBean> getPostMXinWen(Map<String, String> map, Context context) {
        return getPostBasemodel(context,Conarict.BASEURL)
                .ggetpostxinwen(map);
    }
}

BasePresenter类
public class BasePresenter<M, V> {
    public M m;
    public V v;

    public void setM(M m,V v) {
        this.m = m;
        this.v = v;
    }
}

 HomePresenter 类
 public class HomePresenter extends HomeContract.Presenter {
  //GET
    @Override
    public void getPXinWen(String url, Context context) {
        m.getMXinWen(url, context).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<XinWenBean>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                v.Shi(e.getMessage());
            }

            @Override
            public void onNext(XinWenBean xinWenBean) {
                v.XinWen(xinWenBean);
            }
        });
    }
    //POST
    @Override
    public void getPostPXinWen(Map<String, String> map, Context context) {
        m.getPostMXinWen(map, context).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<XinWenBean>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                v.Shi(e.getMessage());
            }

            @Override
            public void onNext(XinWenBean xinWenBean) {
                v.PostXinWen(xinWenBean);
            }
        });
    }
}

TUtils工具类
public class TUtils {
    public static <T> T getT(Object o, int i) {
        try {
            return ((Class<T>) ((ParameterizedType) (o.getClass()
                    .getGenericSuperclass())).getActualTypeArguments()[i])
                    .newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassCastException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static Class<?> forName(String className) {
        try {
            return Class.forName(className);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

BaseActivity类

public abstract class BaseActivity<M extends BaseModel, P extends BasePresenter> extends AppCompatActivity {
    public M m;
    public P p;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        m = TUtils.getT(this, 0);
        p = TUtils.getT(this, 1);

        if (this instanceof BaseView) {
            p.setM(m, this);
        }
        setContentView(getLayoutId());
        initView();
    }

    protected abstract void initView();

    protected abstract int getLayoutId();
}

BaseFrament类

public abstract class BaseFrament<M extends BaseModel,P extends BasePresenter> extends Fragment {
    public M m;
    public P p;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        m= TUtils.getT(this,0);
        p= TUtils.getT(this,1);
        if (this instanceof BaseView){
            p.setM(m,this);
        }

        return inflater.inflate(getLayoutsId(), container, false);
    }

    protected abstract int getLayoutsId();

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initView(view);
    }

    protected abstract void initView(View view);
}

Activity里面
public class MainActivity extends BaseActivity<HomeModel, HomePresenter> implements HomeContract.View{}
​​​​​​​Frament里面
public class BlankFragment extends BaseFrament<HomeModel, HomePresenter> implements HomeContract.View {
GET就
p.getPXinWen(Conarict.XINWENURL,getContext());
POST就
   Map<String, String> map=new HashMap<>();
        map.put("stry","10");
        map.put("stry","10");
        map.put("stry","10");
        p.getPostPXinWen(map,getContext());

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值