【问题标题】:Should I create BaseActivity/Presenter and View in Mosby MvP concept?我应该在 Mosby MvP 概念中创建 BaseActivity/Presenter 和 View 吗?
【发布时间】:2016-01-23 18:30:11
【问题描述】:

我正在尝试理解 MvP 设计模式的概念。我的意思是,我明白了,这很容易。主要问题是优化实现。我尝试制作自己的 BaseActivity、BasePresenter 和 BaseView,只是为了从我的所有活动中提取关节的一部分,我是这样做的:

基础活动

public abstract class BaseActivity<T extends BasePresenter<? extends IBaseView>> extends FragmentActivity implements IBaseView {

    protected T presenter;
    private ActivityConfig activityConfig;

    @Override
    final protected void onCreate(Bundle savedInstanceState) {
        activityConfig = getConfig();

        super.onCreate(savedInstanceState);

        presenter = createPresenter();

        setContentView();
        initLibraries();

        prepareView(savedInstanceState);
        addFragments();
    }

    protected abstract ActivityConfig getConfig();

    protected abstract T createPresenter();

    protected abstract void prepareView(Bundle savedInstanceState);

    protected abstract void addFragments();

    private void setContentView(){
        View root = View.inflate(this, activityConfig.layoutId, null);
        setContentView(root);
    }

    private void initLibraries() {
        ButterKnife.bind(this);
        Timber.plant(new Timber.DebugTree());

    }

    @Override
    public BaseActivity getCurrentContext() {
        return this;
    }

    @Override
    public T getPresenter() {
        return presenter;
    }
}

BasePresenter

public abstract class BasePresenter<T extends IBaseView> {

    public abstract void loadData(boolean refresh);

}

基础视图

public interface IBaseView {

    BaseActivity getCurrentContext();

    BasePresenter getPresenter();
}

它工作正常,但我觉得这个设计不好,所以我想改用 Mosby。问题是所有教程都没有涉及基类的方面,他们只是使用 Mosby 的作为基础(我想这很糟糕?因为我必须复制我的代码(例如 Butterknife.bind())。所以可以你们给我一些设计良好的 Mosby MVP 快速入门课程,或者给我一些如何划分项目的提示?谢谢!

【问题讨论】:

  • android 上的MVP有很多不同的方法,每一种都有proscons,很难说哪一种是对的或更好,你必须为自己找到最适合你的。

标签: android mosby


【解决方案1】:

所以我看到了两种可能性:

  1. 您可以从 Mosby 的 MvpActivity 扩展为您的基类,并添加您的员工,如 initView()initLibraries() 等。这样BaseActivity&lt;P extends BasePresenter&lt;? extends BaseView&gt;&gt; extends MvpActivity&lt;P&gt; implements BaseView。然后MyFooActivity extends BaseActivity&lt;FooPresenter&gt;。因此,您在 BaseActivity 中包含一次 Butterknife,它应该可以工作。但是,您可能必须为 Fragments 复制 Butterknife.bind() 之类的代码,因为 Activity 和 Fragments 显然没有相同的超类。我将向您展示如何解决上述问题。

  2. 反过来:将 Mosby 的功能集成到您的 BaseActivity 中。 Mosby 是按照“优先组合优于继承”的原则构建的。那么这实际上意味着什么? Mosby 提供ActivityMvpDelegate。顾名思义,这个委托完成了实例化 Presenter 等的所有工作。但不是从 MvpActivity 继承,而是使用这个委托并调用相应的委托方法。实际上,如果您查看 source code,Mosby 的 MvpActivity 正是这样做的。因此,不要从 Mosby'sMvpActivity 扩展,您只需在 BaseActivity 中使用 MvpActivityDelegate

那么如何复制Butterknife.bind() 之类的代码,即在 Activity 和 Fragment 中。好吧,Mosby 可以在 Activity 和 Fragment 之间共享他的代码,例如实例化 Presenter 等,因为两者都使用 mosby 委托。

因此您可以应用相同的原则:您可以将共享代码放入委托中,并从活动和片段中调用委托。 问题是:是否值得,即Butterknife.bind() 只是一个电话。您还必须拨打一个电话yourDelegate.doSomething() ... 但是,如果您必须在 Activity 和 Fragment 之间重用“关键代码”,那么请像 Mosby 那样支持组合。

如果您知道您只使用Activites,那么从 Mosby 的 MvpActivity 扩展也是一个不错的选择,如 1. 解决方案中所述。

【讨论】:

    【解决方案2】:

    我只是想补充一下 sockeqwe 的第一个答案。

    在有意义的地方创建自己的基类是非常好的。这也很简单。

    例如,我需要创建一个具有一些默认行为的基础Fragment。您需要做的就是复制基本泛型类型签名并将其传递给基类。

    例如:

    public abstract class MyBaseFragment&lt;V extends MvpView, P extends MvpPresenter&lt;V&gt;&gt; extends MvpFragment&lt;V, P&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多