Android-使用活动/上下文的MVP

时间:2018-07-23 15:50:09

标签: android design-patterns mvp

我一直在研究Android的MVP,并从不同的站点阅读有关不将活动作为参数传递给演示者的信息,因为这是一种反模式,但是我遇到了一个问题,我需要使用第三方方法需要活动/上下文。

我曾经考虑过使用依赖注入,进行另一种抽象或仅将其传递给需要它的方法,而不是传递给构造函数,但我对更好的方法感到困惑。

科特林(演示者)中的一个例子

fun Food(*should activity be passed here?*) { 
var bar = Foo(activity).build

Stand(bar, callback{})
}

如果有人能对此有所启发,那就太好了。

2 个答案:

答案 0 :(得分:0)

我认为您应该避免将Activity Context传递给Presenter的任何明显原因。听说您应该使主持人独立于任何Android程序包,因为您可以将其重用于桌面/电视或其他平台,但是我认为这不起作用。

如果您需要在演示者中进行活动,则可以通过多种方法进行 (我的DI盒将使用Dagger2库,但您可以看看另一个):

  • 只需通过setter / constructor中的活动,以使其更安全地使用WeakReference。这就是我们在项目中执行的操作。

    公共类BasePresenter实现IPresenter {

    protected VIEW view;
    private WeakReference<FragmentActivity> activityWeakReference = new WeakReference<>(null);
    
    @Override
    public void onStart(FragmentActivity activity) {
        activityWeakReference = new WeakReference<>(activity);
    }
    
    @Override
    public void onStop() {
        activityWeakReference.clear();
    }
    
    @Override
    public void onViewCreated(Bundle savedInstanceState) {
    }
    
    public Optional<FragmentActivity> getActivity() {
        return Optional.ofNullable(activityWeakReference.get());
    }
    
    public void getActivity(Action1<FragmentActivity> action) {
        getActivity().ifPresent(action::call);
    }
    
    @Override
    public void setView(VIEW view) {
        this.view = view;
    }
    
    @Override
    public boolean onBackPressed() {
        return false;
    }
    
    @Override
    public void navigationButtonClick() {
        getActivity(Activity::finish);
    }
    
    @Override
    public boolean onCustomActivityResult(int requestCode, int resultCode, Intent data) {
        return false;
    }}
    
    • 您可以将上下文提供给this之类的匕首模块。

    • 您可以使用Dagger Android注射器。我个人不喜欢它,但是应该可以。阅读此article

当不再需要演示者时,不要忘记取消您的活动,因为它们的内存很大,因此会导致泄漏。

答案 1 :(得分:0)

如果您想以一种“干净的方式”工作,则应始终将框架(android,第三方库,数据源...)推送到体系结构的外层(尽可能远离业务逻辑)

在您的情况下,我将为第三方库和上下文创建一个“包装器类”,然后将此类的接口作为演示者的构造函数参数注入。 这样,您的演示者就可以保持干净,并且不必更改第三方库。

在这里您可以阅读有关干净架构的更多信息:

https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html

https://github.com/android10/Android-CleanArchitecture

https://android.jlelse.eu/a-complete-idiots-guide-to-clean-architecture-2422f428946f