android - 我应该在 Mosby MvP 概念中创建 BaseActivity/Presenter 和 View 吗?

标签 android mosby

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

基础 Activity

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;
    }
}

基本演示者

public abstract class BasePresenter<T extends IBaseView> {

    public abstract void loadData(boolean refresh);

}

基础 View

public interface IBaseView {

    BaseActivity getCurrentContext();

    BasePresenter getPresenter();
}

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

最佳答案

所以我看到两种可能性:

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

  2. 反其道而行之:将 Mosby 的功能集成到您的 BaseActivity 中。 Mosby 的构建原则是“优先组合而非继承”。那么这实际上意味着什么呢?莫斯比提供 ActivityMvpDelegate 。顾名思义,该委托(delegate)完成实例化 Presenter 等的所有工作。但不是从 MvpActivity 继承。您使用此委托(delegate)并调用相应的委托(delegate)方法。实际上是莫斯比的MvpActivity如果您查看source code,那么您就是这么做的。 。因此,不要从 Mosby 的 MvpActivity 延伸您只需使用 MvpActivityDelegate在你的BaseActivity

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

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

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

关于android - 我应该在 Mosby MvP 概念中创建 BaseActivity/Presenter 和 View 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34967154/

相关文章:

android - 从子类访问字符串资源

android - Mosby MVP - 如何在 onDestroyView() 之后重新创建 Fragment 的状态?

android - Presenter/View/ViewState 关系

java - Android 计算器应用程序运行时立即崩溃

android - Crashlytics NDK 解析 NDK 崩溃数据失败

android - 当我点击在后台运行的通知时,它总是调用 MainActivity ,我如何调用我的 WebVIew

sql - 按日期排序数据?

java - 在 Mosby 和 Dagger 2 的 Base Presenter 中使用泛型

java - 如何向 mosby MVPActivity 添加基类?

android - MVP:如何从 Presenter 写入日志