簡體   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