簡體   English   中英

Android MVP正確發布演示者的方式

[英]Android MVP Proper Way to Release Presenter

我正在使用MVP架構,我一直堅持如何正確釋放演示者。 首先,讓我告訴你們發生了什么。

問題

1)我的演示者發出異步服務器請求。

2)當我收到服務器響應時,我的視圖(片段)已經分離,但我仍然在我的演示者上保持其實例(這可能導致內存泄漏),我從View調用一個方法來設置從服務器收到的一些數據。

3)在我的視圖中,我使用getActivity()方法的上下文,在此階段將返回null

我如何試圖解決這個問題

1)當我分離片段時,我在演示者上調用了release()方法。 在這個方法中,我考慮將視圖的實例設置為null。 這可行,但后來我需要在演示者的每個地方添加空檢查,檢查我的視圖是否已設置為null。 似乎不是最好的方法。

2)在我的視圖(片段)中,在使用之前檢查getActivity()是否為null。 但它並沒有解決內存泄漏問題,我需要在我的片段中隨處添加這個檢查;


你們有替代品嗎? 當我的片段被分離時,這是一種釋放我的演示者的正確方法,每當我的演示者在我的視圖上調用一個方法時,我將確保該視圖附加到一個Activity? EventBus是一個很好的方法嗎?

非常感謝!

presenter層的主要目標之一是獨立於Android Framework,這意味着您沒有從Android Framework導入任何包,使其成為純Java類。 你應該讓你的ActivityFragment實現ActivityView接口或FragmentView接口,讓具體的ActivityFragment實現那個接口。 現在,在onCreate()創建一個presenter實例並將View(Activtity或Fragment)作為參數傳遞,在Presenter類中,您將擁有ActivityViewFragmentView引用,通過構造函數初始化它,如下所示:

Activity.java

public class Activity implements ActivityView {
    ...
    private Presenter mPresenter;

    public void onCreate() {
         // some other code

         mPresenter = new Presenter(this);

         // some other code
    }

Presenter.java

    public class Presenter {
         private ActivityView mActivityView;


         public Presenter(ActivityView activityView) {
           this.mActivityView = activityView;
         }
}

現在,您可以調用ActivityFragments方法,但必須在界面中列出這些方法。 如果你是你的RxJava2,你可以在Presenter擁有CompositeDisposable對象,將你的網絡調用添加到那個一次性,並且在ActivityFragment適當生命周期方法中,你可以通過Presenter調用compositeDisposable上的dispose()方法。 這樣,您將清除任何正在進行的網絡操作,如果UI不存在,則不會更新UI。 希望這個答案可以幫助你:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM