Android MVP框架 小结

公司项目中用了MVP框架,这里进行一点总结,详细说明都在代码注释里面

项目中我喜欢按功能进行处理

先展示base包中的处理

  BaseActivity

public class BaseActivity extends AppCompatActivity {


    /**
     * 1 进行一些Activity的公共处理
     * 2 对Activity的批量管理操作
     * 3 等等其他操作
     *
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);

    }

    //你自己项目中需要进行的一些处理

}



BaseViewActivity

/**
 * 为啥要弄这么一个BaseViewActivity 而不是直接用BaseActivity进行View处理
 * 是为了如果有其他Activity不需要处理View但是又需要BaseActivity中其他相同部分的公共处理
 * 所以就不在BaseActivity中进行处理 而是新加了BaseViewActivity
 *
 * @param <V>
 * @param <T> 此处 T extends BasePresenter
 *            是为了 presenter.setViewReference((V) this);
 *            设置View
 */
public abstract class BaseViewActivity<V, T extends BasePresenter> extends BaseActivity {

    protected T presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_presenter);
        presenter = getPresenter();
        //
        presenter.setViewReference((V) this);

    }

      abstract protected T getPresenter();


    public void destroyView() {
        if (null != presenter) {
            presenter.destroyView();
            presenter = null;
        }

    }

}


BasePresenter

public class BasePresenter<V> {


    protected V view;
    //弱引用 防止Activity非正常退出造成内存泄漏
    private WeakReference<V> viewReference;

    public void setViewReference(V view) {
        viewReference = new WeakReference(view);
    }

    public V getView() {

        if (null != viewReference)
            return viewReference.get();

        return null;

    }

    public void destroyView() {

        if (null != viewReference) {
            viewReference.clear();
            viewReference = null;
        }

    }


}

____________________________分割线_________________________________

login包里面

LoginConstruct

public interface LoginConstruct {

    interface LoginView {
        void loginResult(String json);
    }

    abstract class LoginPresenter extends BasePresenter<LoginView> {
        abstract void login(String url, String... args);
    }

}

 

LoginActivity

public class LoginActivity extends
        BaseViewActivity<LoginConstruct.LoginView, LoginConstruct.LoginPresenter>
        implements LoginConstruct.LoginView {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login2);
        initData();

    }

    private void initData() {
        //此处模拟数据请求工作
        presenter.login("一些参数", "一些参数");
    }

    @Override
    protected LoginConstruct.LoginPresenter getPresenter() {
        // 设置presenter实例化对象
        return new LoginPresenterImp();
    }

    @Override
    public void loginResult(String json) {
        //结果返进行后续处理
        //...
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //此处没有进行销毁操作
        // 是在BaseViewActivity进行统一处理
    }

}

 

LoginPresenterImp

public class LoginPresenterImp extends LoginConstruct.LoginPresenter {

    @Override
    public void login(String url, String... args) {
        /**
         * 进行网络请求,及收到结果,后续操作
         * 这里我是封装的Retrofit
         */


        Observer loginOB = new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull String s) {
                //结果返回 处理结果
                doLoginResult(s);
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        };
        NetUtils.getData(url, loginOB, args);
    }


    private void doLoginResult(String json) {

        //拿到结果进行你需要的处理
        //我就简单的直接传回View
        if (null != getView())
            getView().loginResult(json);
        
    }
    
}

 

下面对比看一下是如何操作的

未完待续

猜你喜欢

转载自blog.csdn.net/u011288271/article/details/105701305