2012-10-23 31 views
6

aşağıdaki gibi görünen bir etkinliğe sahiptir: denir OnDestroy sonraAndroid.os.Message ve/veya Handler.removeCallback'de bellek sızıntısı var mı?

class MyActivity extends Activity { 
    Runnable refreshTimer = new Runnable() { 
     public void run() { 
      refresh(); 
     } 
    }; 

    protected onCreate(...) { 
     handler.postAtTime(refreshTimer, ...); 
    } 

    protected onDestroy() { 
     handler.removeCallbacks(refreshTimer); 
    } 

    protected void refresh() { ... } 
} 

nedense MyActivity $ 0 referansları (yenileme Runnable) içerirler etkinliğin MessageQueue iletiler hala var. MyActivity $ 0'ın MyActivity öğesine zımni bir başvurusu olduğundan, bu MyActivity bağlamında bir bellek sızıntısına neden olur.

android.app.Activity Eclipse Memory Analyzer Aracı kullanarak hayaleti, yumuşak, zayıf, vb başvurular hariç için merge_shortest_paths sonucu: enter image description here

(yukarıdaki kaynak kodu görüntülenen fiili nesne ilişkisinin bir basitleştirme olduğunu MAT dökümü)

removeCallbacks çağırmasın, çalıştırılabilir nesnelere yapılan tüm referansları Kuyruktan kaldırır mısınız? Neden bağlamları sızdırıyorsunuz? denemek için

cevap

2

şey:

android dokümanlar göre:

OnDestroy: etkinlik yok olmadan önce, aldığınız son çağrı. Bu, etkinlik bittiği için (sonuçta finiş() olarak adlandırılır, ya da sistem geçici olarak bu olayın geçici olarak alandan tasarruf etmesinden kaynaklanabilir. Bu iki senaryoyu isFinishing() yöntemi ile ayırt edebilirsiniz.

Eğer aktiviteyi çıkarken zaman

, hala bir sıraya mesajların demet ve kaydı iptal için bağlam iptal geri arama yürütmesini değil var gibi görünüyor

ne yapmalıyım senin çalıştırılabilir onPause içinde kaydını geçerli:. Bu Geri arama çoğunlukla, etkinliğin düzenlediği kalıcı bir durumun kurtarılması, kullanıcıya "yerinde düzenleme" modelinin sunulması ve ne başlatmak için yeterli kaynak yoksa, hiçbir şeyin kaybedilmemesi için kullanılır. Bu aktiviteyi ilk önce öldürmeden. Bu, aynı zamanda mümkün olduğunca hızlı bir şekilde bir sonraki etkinliğe geçiş yapmak veya kamera gibi özel erişime sahip kaynakları kapatmak için animasyonları durdurma ve CPU'nun dikkat çekici miktarını tüketen diğer şeyler yapmak için iyi bir yerdir. Tipik

Runnable onResume kayıt ve yenileme ne yaptığını görmeden daha iyi yaşam döngüsü eşleştirme

için OnPause içinde kaydını olacak "Planlanmış" Bir Alıcı veya

, bunun nedeni sızıntı olabilir, anlatmak zor yenileme yönteminde başvurulan etkinlik kapsamı olan etkinlik referansları.