MVP造成的記憶體洩漏
MVP有很多的優點,例如易於維護,易於測試,鬆耦合,複用性高,健壯穩定,易於擴充套件等。但是,由於Presenter經常性的需要執行一些耗時操作,那麼當我們在操作未完成時候關閉了Activity,會導致Presenter一直持有Activity的物件,造成記憶體洩漏。
怎麼樣解決這個問題呢,我們只要在Activity或者Fragment關閉的時候將Presenter中的引用釋放掉就可以了,但是如果有所的介面都去操作那樣就變得很麻煩,所以我們在BaseActivity或BaseFragment中去操作,具體程式碼如下:
public abstract class BasePresenter<T> {
protected Reference<T> mViewRef;//View介面型別弱引用
public void attachView(T view) {
mViewRef = new WeakReference<T>(view); //建立關聯
}
protected T getView() {
return mViewRef.get();//獲取View
}
public boolean isViewAttached() {//判斷是否與View建立了關聯
return mViewRef != null && mViewRef.get () != null;
}
public void detachView() {//解除關聯
if (mViewRef != null) {
mViewRef.clear();
mViewRef = null;
}
}
}
這裡定義了四個方法,View通過泛型傳遞進來,Presenter對這個View持有弱引用。
public abstract class BaseActivity<V, T extends BasePresenter<V>> extends LibBaseActivity {
protected T mPresenter;//Presenter物件
@SuppressWarnings("unchecked")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = createPresenter();//建立Presenter
mPresenter.attachView((V) this);
}
@Override
protected void onDestroy() {
super.onDestroy();
mPresenter.detachView();
}
protected abstract T createPresenter();
}
BaseActivity含有兩個泛型引數,第一個是View介面型別,第二個是Presenter的具體型別,在onCreate()中建立通過createPresenter建立一個具體的Presenter,在onDestroy()中釋放Presenter中的引用。
相關推薦
ios - 知識梳理(造成記憶體洩漏的原因)
block的迴圈引用 [self.service requestData:^(id data) { self.title = data[@"title"]; }]; 這種情況就是典型的迴圈引用導致記憶體洩漏,self強引用service, service強引用了block,
匿名內部類持外部引用造成記憶體洩漏問題
public class SampleActivity extends Activity { private final Handler mLeakyHandler = new Handler() { @Override publi
《MFC使用OpenCV造成記憶體洩漏問題》
問題描述 新建一個MFC應用程式,匯入OpenCV,只要使用了OpenCV裡面的東西(假設定義了一個Mat變數),當程式在執行時,不會有任何反應,但是當點選應用程式右上角的叉叉關閉程式時,那麼問題就來了,輸出視窗會出現一大堆記憶體洩漏問題,這是假記憶體洩漏,如下圖所示: D
AsyncTask造成記憶體洩漏的原因 解析
以我現在的認識,造成記憶體洩漏的原因,往大了說,無非就是一些特殊的原因導致Activity在該銷燬的時候無法被銷燬,而AsyncTask在建立的時候會持有當前Activity的引用,所以也有可能導致記憶體洩漏!因為在上篇關於AsyncTask的介紹中,對
(轉)基類解構函式必須為虛擬函式否則會造成記憶體洩漏
看看下面程式有什麼錯誤: #include <iostream> using namespace std; class Father { public: Father(){}; ~Father(){}; }; class Son:public
基類解構函式必須為虛擬函式否則會造成記憶體洩漏
看看下面程式有什麼錯誤: #include <iostream> using namespace std; class Father { public: Father(){}; ~Father(){}; }; class Son:public Father { publi
android MVP 模式記憶體洩漏如何解決
MVP簡介M-Modle,資料,邏輯操作層,資料獲取,資料持久化儲存。比如網路操作,資料庫操作 V-View,介面展示層,Android中的具體體現為Activity,Fragment P-Presenter,中介者,連線Modle,View層,同時持有modle引用和vie
哪些常見操作會造成記憶體洩漏?
記憶體洩漏指任何物件在您不再擁有或需要它之後仍然存在。垃圾回收器定期掃描物件,並計算引用了每個物件的其他物件的數量。如果一個物件的引用數量為 0(沒有其他物件引用過該物件),或對該物件的惟一引用是迴圈的,那麼該物件的記憶體即可回收。setTimeout 的第一個引數使用字串
C++ 釋放指向類的void型別指標造成記憶體洩漏
先來看一段程式碼 #include <iostream> using namespace std; class A { public: A(){ cout << "A() ...." << endl; } ~A() {
C++造成記憶體洩漏的原因彙總:
對於C++的記憶體洩漏,總結一句話:就是new出來的記憶體沒有通過delete合理的釋放掉! 一、程式迴圈new創建出來的物件沒有及時的delete掉,導致了記憶體的洩露; 程式碼如下: #include <iostream> #include
Microsoft.Extensions.DependencyInjection中的Transient依賴注入關係,使用不當會造成記憶體洩漏
Microsoft.Extensions.DependencyInjection中(下面簡稱DI)的Transient依賴注入關係,表示每次DI獲取一個全新的注入物件。但是使用Transient依賴注入關係時,最好要配合IServiceScope來一起使用,因為通過Transient依賴注入關係建立的物件,都
MVP造成的記憶體洩漏
MVP有很多的優點,例如易於維護,易於測試,鬆耦合,複用性高,健壯穩定,易於擴充套件等。但是,由於Presenter經常性的需要執行一些耗時操作,那麼當我們在操作未完成時候關閉了Activity,會導致Presenter一直持有Activity的物件,造成記憶體
threadlocal與ThreadPoolExecutor造成的記憶體洩漏
threadlocal與執行緒相關,每個執行緒都會有一份,參考 http://python.jobbole.com/86150/ ThreadPoolExecutor建構函式裡面有max_workers引數,如果這個引數設定的不好,就有可能造成記憶體洩漏。 示例程式碼如
安卓專案實戰之:最實用的Retrofit2+RxJava2+MVP框架搭建,避免各種記憶體洩漏
工程目錄結構 目前網上的mvp框架大多存在以下問題: 1,Presenter持有View的引用,容易導致出現記憶體洩漏 MvpPresenter mvpPresenter = new MvpPresenter(this); // 不推薦這樣寫,持有activty引用,容易出現
mvp銷燬,解決記憶體洩漏
mvp銷燬,解決記憶體洩漏 //model層銷燬執行緒 public void onDestory() { if (handler != null) { handler.removeCallbacksAndMessages(null); handler = null; } } //p
深拷貝拯救指標重複釋放(淺拷貝)造成的記憶體洩漏
1. 淺拷貝以及記憶體洩漏的背景 先考慮一種情況,對一個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式——拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。 #include <iostream> #include "student.h"
匿名內部類造成的記憶體洩漏
3、對於需要在靜態內部類中使用非靜態外部成員變數(如:Context、View ),可以在靜態內部類中使用弱引用來引用外部類的變數來避免記憶體洩漏 4、對於生命週期比Activity長的內部類物件,並且內部類中使用了外部類的成員變數,可以這樣做避免記憶體洩漏: 將內部類改為靜態內部類 靜態內部類中使用弱引用來
android中mvp+retrofit+rxjava處理mvp記憶體洩漏整合的demo
程式碼如下:專案結構:至於mvp的原理,v層抽象出介面,供P層呼叫,M層進行資料處理,抽象出介面,供P呼叫,P層中可拿到M和V 的介面引用,進行方法呼叫等邏輯處理,再利用介面回撥的方式將解析好的資料返回給V層,這樣就打到M層不直接和V層打交道,實現解耦和的效果mvp模式會存在
Android 匿名內部類造成的記憶體洩漏
我們在寫專案的時候,很容易在一個Actiivty下面利用如下程式碼: private Handler handler = new Handler(){ @Override public void handleMessage(Messa
Android開發:淺談MVP模式應用與記憶體洩漏
最近博主開始在專案中實踐MVP模式,卻意外發現記憶體洩漏比較嚴重,但卻很少人談到這個問題,促使了本文的釋出,本文假設讀者已瞭解MVP架構。 MVP簡介 M-Modle,資料,邏輯操作層,資料獲取,資料持久化儲存。比如網路操作,資料庫操作 V-Vie