如何在MVP模式中将上下文传递给存储库

时间:2018-05-03 12:28:55

标签: android performance android-layout android-fragments android-mvp

我一直在学习和整合MVP pattern,并且几乎没有问题。

我从这张图中了解到的是

Activity将创建Presenter的实例,并将其引用和model对象传递给演示者

MainPresenter mainPresenter = new MainPresenter(this, new MainModel());

接下来如果演示者需要存储或从本地首选项或远程获取任何数据,它将询问模型。

然后模型将要求存储库存储和检索数据。

enter image description here

我遵循了一些教程,这就是我实现模式的方法。

接口

public interface MainActivityMVP {

    public interface Model{

    }

    public interface View{
        boolean isPnTokenRegistered();
    }

    public interface Presenter{

    }
}

活动

MainPresenter mainPresenter = new MainPresenter(this, new MainModel());
mainPresenter.sendDataToServer();

演示

public void sendDataToServer() {

    //  Here i need to ask `model` to check 
        do network operation and save data in preference
}

现在问题是我需要上下文来访问sharedPreference,但我还没有将context传递到任何地方。我也不想使用static context。我想知道将上下文传递给MVP模式的正确方法。

2 个答案:

答案 0 :(得分:2)

嗯,最好的方法是将您的首选项类包装在一个帮助器类中,并使用Dagger将它注入到您需要的任何位置,这样您的演示者/模型就不需要了解上下文。 例如,我有一个应用程序模块,提供各种单例,其中一个是我的Preferences Util类,它处理共享首选项。

@Provides
@Singleton
public PreferencesUtil providesPreferences(Application application) {
    return new PreferencesUtil(application);
}

现在,无论何时我想使用它,我只是@Inject it:

@Inject
PreferencesUtil prefs;

我认为值得学习曲线,因为你的MVP项目会更加分离。

但是,如果您愿意忘记“Presenter不了解Android上下文”规则,您只需在视图界面中添加getContext方法并从视图中获取Context:

public interface MainActivityMVP {

    public interface Model{

    }

    public interface View{
        boolean isPnTokenRegistered();
        Context getContext();
    }

    public interface Presenter{

    }
}

然后:

public void sendDataToServer() {
      Context context = view.getContext();
}

我见过有些人像这样实施MVP,但我个人的偏好是使用Dagger。

您也可以按照评论中的建议使用应用程序文本。

答案 1 :(得分:1)

你所要求的并不是那么远。你有一个模型接口,所以你有一个实现这个接口的类,可能是这样的:

MainModel implements MainActivityMVP.Model{
    SharedPreferences mPrefs;

    MainModel(Context context){
        mPrefs =context.getSharedPreferences("preferences",Context.MODE_PRIVATE);
    }
}

因此,您只需要将该引用传递给您的演示者,但不是接收MainModel类,而是可以接收MainActivityMVP.Model。

MainActivityMVP.Presenter mainPresenter = new MainPresenter(this, new MainModel(getContext()));

MainPresenter implements MainActivityMVP.Presenter{

     MainActivityMVP.View mView;
     MainActivityMVP.Model mModel;

     MainPresenter(MainActivityMVP.View view, MainActivityMVP.Model model){
           mView = view;
           mModel = model;
     }
}

通过这种方式,您没有任何上下文引用到您的演示者,并且引用是进入您的MainModel而不是您的MainActivityMVP.Model。

将任何公共方法添加到演示者/视图/模型界面中。你应该有这样的东西:

public interface MainActivityMVP {

    public interface Model{
        void saveOnSharedPreferences();
    }

    public interface View{
        boolean isPnTokenRegistered();
    }

    public interface Presenter{
        void sendDataToServer();
    }
}