Frage

Ich habe Problem mit dem Gedächtnis nach oft meiner App läuft.

java.lang.OutOfMemoryError: Bitmap-Größe überschreitet VM Budget

Ich denke, ich war Speicher undicht irgendwie so ich eine DUMP HPROF Datei hat und verwendet, um das MAT-Tool, um herauszufinden, was falsch war. Es stellt sich heraus, dass nach wie 5-mal die App läuft und quiting, finde ich 5 Instanzen meiner Aktivität und 5 Fälle von PhoneStateListener.

Wenn ich den Anruf zu PhoneStateListener entfernen, ich weiß nicht, diese Frage mehr haben und ich sehe nur 1 Instanz meiner Tätigkeit.

Die Frage ist, wie dies ich lösen?

Danke

Daniel


Hier ist mein Code:

OnCreate Methode:

telephonyManager.listen(mPhoneListener,
                PhoneStateListener.LISTEN_SERVICE_STATE
                | PhoneStateListener.LISTEN_SIGNAL_STRENGTH
                | PhoneStateListener.LISTEN_CALL_STATE
                | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
                | PhoneStateListener.LISTEN_DATA_ACTIVITY); 

auf der Aktivitätsklasse:

PhoneStateListener mPhoneListener = new PhoneStateListener() {
        public void onCallStateChanged(int state,
                java.lang.String incomingNumber) {
        //do something
    }
}

auf onDestroy Methode:

telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE);        
mPhoneListener = null;
War es hilfreich?

Lösung

onDestroy ist nicht zu bekommen genannt garantiert. Quelle: onDestroy Docs

Sie sollten versuchen, auf onPause Reinigung und dann onResume Wieder instate das Material, das Sie benötigen. Dies wird auf einigen Speicherdruck und Leckagen sauber helfen.

Andere Tipps

Die Antwort oben ist nicht korrekt. OnDestroy () ist hier kein Problem, wie der Prozess zu töten wird natürlich den gesamten Speicher und Bindemittel frei

Es ist ein sehr wichtiges Element, das Sie in Betracht hier zu nehmen. Das Bindemittel mit den Telefonie-Managern registriert wird nur freigegeben, nachdem das zugehörige Bindemittel Objekt im Systemprozess wird veröffentlicht. Dies kann lange dauern, nachdem richtig enfernen den Hörer, weil es in dem Systemprozess einige Zeit vor dem nächsten GC Laufe nehmen kann reklamiert das Objekt und damit der Verweis auf Ihre Zuhörer.

Das Beste, was Sie tun können, ist manuell die Verweise vom Hörer auf andere Objekte zu entfernen, wenn Sie mit ihm in onDestroy fertig sind ().

PhoneStateListener mPhoneListener = new PhoneStateListener() 
{ 
    public void onCallStateChanged(int state, java.lang.String incomingNumber) 
    { 
    //do something 

     telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE); 
     mPhoneListener = null;
    } 
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top