Giter Site home page Giter Site logo

mvphelper's Introduction

MVP辅助框架

前言

如果你的项目是一个纯app商业项目,你更应使用以下两种其一的框架进行开发

  1. MVVM框架(Databinding+LiveData +ViewModel)的方式
  2. Android Jetpack Compose框架

如果你的项目是一个复杂的SDK项目,那么你可以尝试使用这个MVP框架进行处理

V层与P层之间都只能使用接口进行调用,双方不允许持有对方实现对象

V层

Activity

@InjectPresenter(values = {MyPresenterImpl1.class, MyPresenterImpl2.class})
public class MyActivity extends AppCompatActivity implements MyViewAPI {
    // 实例MVPHelper
    private final MVPHelper mvpHelper = new MVPHelper();
    // MyPresenter1 为 MyPresenterImpl1 的接口定义
    private MyPresenterAPI1 mPresenter1;
    // MyPresenter2 为 MyPresenterImpl2 的接口定义
    private MyPresenterAPI2 mPresenter2;

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(newBase);
        // 将MVPHelper与你当前的Activity进行绑定
        mvpHelper.attach(this);
        // 通过P层接口的类对象进行查找P层实例对象
        mPresenter1 = getPresenterAPI(MyPresenterAPI1.class);
        mPresenter2 = getPresenterAPI(MyPresenterAPI2.class);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //委托声明周期处理(Presenter中会被触发)
        mvpHelper.onCreate();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //委托声明周期处理(Presenter中会被触发)
        mvpHelper.detach();
    }
    
    // 提供查询Presenter的方法
    protected <T> T getPresenterAPI(Class<T> cls){
        return mvpHelper.getPresenterAPI(cls);
    }
}

Fragment

@InjectPresenter(values = {MyPresenterImpl1.class, MyPresenterImpl2.class})
public class MyFragment extends Fragment implements MyViewAPI {
    private final MVPHelper mvpHelper = new MVPHelper();

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        mvpHelper.attach(this);
    }

    protected <T> T getPresenterAPI(Class<T> cls) {
        return mvpHelper.getPresenterAPI(cls);
    }

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

    @Override
    public void onDestroy() {
        super.onDestroy();
        mvpHelper.detach();
    }
}

P层

P层需要继承 z1w3.mvp.support.BasePresenter

// P层实现允许被单例
// 声明单例后,getContext()方法 为 applicationContext
@Singleton
public class MyPresenterImpl1 extends BasePresenter implements MyPresenter {

    private MyViewAPI viewAPI;
    private MyPresenterAPI2 mPresenterAPI2;

    // 如果使用单例则只会触发一次
    @Override
    public void onCreate() {
        super.onCreate();
        // 单例的Presenter 无法获取ViewAPI
        viewAPI = getViewAPI();
        // 单例的Presenter 只能获取同样是单例的Presenter
        // 非单例Presenter 无此限制
        mPresenterAPI2 = getOtherPresenterAPI(MyPresenterAPI2.class);
    }
    
    // 如果使用单例则不会触发
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

注解

V层实现通过注解的形式将P层实现注入

@InjectPresenter(values = {MyPresenterImpl1.class, MyPresenterImpl2.class})
public class MyActivity extends Activity{/*_*/}

@InjectPresenter(values = {MyPresenterImpl1.class, MyPresenterImpl2.class})
public class MyFragment extends Fragment{/*_*/}

V层注解声明

@ViewAPI
public interface MyViewAPI{}

P层注解声明

@PresenterAPI
public interface MyPresenterAPI{}

P层单例声明

@Singleton
public class MyPresenterImpl1 extends BasePresenter implements MyPresenterAPI{/*_*/}

混淆

# MVP
-keep class z1w3.mvp.support.**{public *;}

计划中的功能实现

  1. Presenter的getter/setter实现IOC
  2. 运行时解析注解改为编译时解析

mvphelper's People

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.