繁体   English   中英

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

[英]Android - MVP using Activity/Context

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

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

Kotlin(Presenter)中的一个例子

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

Stand(bar, callback{})
}

如果有人可以启发我,那就太好了。

我认为您应该避免将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; }} 
    • 您可以像这样为dagger模块提供上下文。

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

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

如果要以“干净的方式”工作,则应始终将框架(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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM