Android Uygulamada Bellek Aşımı
-
Merhaba hocalar,
Kendi çapımda uğraşıyorum, mobil programlamayla. Çok basit bir sorunum var ama bir türlü çözemedim.
Şimdi uygulamanın layout unun background una bir bitmap veriyorum.
Sonra uygulama yeni intent e geçtiği zaman, geçtiğimiz intent in arkaplanındaki bitmapini silmek istiyorum ki bellekte yer kaplamasın.
Uygulama onResume ile arkaplan fotoğraf ını oluştururken, onPause ilede silmesini bekliyorum. bunun için onPause da, bitmap i recycle ediyor ve null yapıyorum. Ancak bitmap i silmiyor. ve onResume ile bitmap oluşturulduğu için.. sonraki intent e gidip geri gelince uygulamada bellek iyice şişiyor. onPause içinde layout.removeAllViews () falanda denedim ama işe yaramıyor.
-
Hocam merhaba. Manifest içinde
android:largeHeap="true"
ekleyip dener misin ?
edit: verdiğim çözüm bitmap i silmek için değil de, outOfMemory hatası almanı engellemek içindir.
manyaki tarafından 29/Kas/16 12:21 tarihinde düzenlenmiştir -
Her seferinde onResume'da olusturup onPause'da silmek yerine, bu Bitmap objesini bir kere olusturup sonrasinda yeni olusturacagin bir classin static objesi yaparsan hem surekli olusturmana gerek kalmaz hem uygulamanin her yerinden hizli bir sekilde erisme imkanin olur hem de bu resmi ne kadar cok yerde kullanirsan kullan memoryde toplamda sadece 1 bitmap tutmus olursun.
-
manyaki bunu yazdı
Hocam merhaba. Manifest içinde
android:largeHeap="true"
ekleyip dener misin ?
edit: verdiğim çözüm bitmap i silmek için değil de, outOfMemory hatası almanı engellemek içindir.
Hocam onu yapmak istemiyorum işte :) memory i düzenlemek istiyorum yoksa çok baş ağrıtacak gibi
-
Tawe bunu yazdı
Her seferinde onResume'da olusturup onPause'da silmek yerine, bu Bitmap objesini bir kere olusturup sonrasinda yeni olusturacagin bir classin static objesi yaparsan hem surekli olusturmana gerek kalmaz hem uygulamanin her yerinden hizli bir sekilde erisme imkanin olur hem de bu resmi ne kadar cok yerde kullanirsan kullan memoryde toplamda sadece 1 bitmap tutmus olursun.
Hocam benim temel problemim o 1 bitmapi bile bellekde tutmak istememem. yani free yapmak istiyorum.
-
BerkayCit bunu yazdıTawe bunu yazdı
Her seferinde onResume'da olusturup onPause'da silmek yerine, bu Bitmap objesini bir kere olusturup sonrasinda yeni olusturacagin bir classin static objesi yaparsan hem surekli olusturmana gerek kalmaz hem uygulamanin her yerinden hizli bir sekilde erisme imkanin olur hem de bu resmi ne kadar cok yerde kullanirsan kullan memoryde toplamda sadece 1 bitmap tutmus olursun.
Hocam benim temel problemim o 1 bitmapi bile bellekde tutmak istememem. yani free yapmak istiyorum.
peki yeni bir activity baslatirken oncekini finish() fonksiyonuyla bitiriyor musun? ya da yeni activity'ni startActivityForResult() fonksiyonuyla baslatip isin bitince geri ayni activity'e dondugune emin misin? kullandigin bitmapin boyutunu bilmiyorum fakat 1 tane bitmapin memory sismesine sebep olacagini sanmiyorum. isi biten fakat finish() yapilmamis activityler androidde memory sismesinin en buyuk sebeplerinden biridir. cunku arkaplanda calisan activityler kendi tuttugu resimlerin, objelerin garbage collector tarafindan temizlenmesini engeller.
-
1 Fragment kullanıyorsan üst üste gelecek Fragmentler ve arka planda bekletilen kodlar yüzünden belleğin şişebilir. Sebebi Recursive function. Arka planda bir Fragmentler bazen birbirine bağlı oalbiliyor keza Activityler de. Yani sen bir activity acıp o activity bitiminden Destroy olduktan sonra dönen değeri bekliyorsan bir öncekinde. Arkada bir Recusive çalışır. Fragment acarken kapatırken vs sürekli boş fragmentleri yakalamalısın.
Ek olarak MainThread üzerinde birden cok Thread var ise buda belleğini şişirir.
1 tane bitmap senin uygulamanı cok fazla belleğe tecavüz etmez. He diyorsan bir android cihaz üzerinde Örneğin 2.2 yüklü 256 mb ram'i olan bir cihazda çalıştırıyorum haliyle öldürüyor.
android garbage collection araştırmalısın ki Saçma sapan çerezleri silesin Bitmap değerini de null yap collect işleminden önce bu sefer ram'ini iyi kullanmış olursun.
@manyaki hocam zaten söylemiş sana Manifest'i düzenleyerek yap derim uğraşmana gerek yok..
-
Tawe bunu yazdıBerkayCit bunu yazdıTawe bunu yazdı
Her seferinde onResume'da olusturup onPause'da silmek yerine, bu Bitmap objesini bir kere olusturup sonrasinda yeni olusturacagin bir classin static objesi yaparsan hem surekli olusturmana gerek kalmaz hem uygulamanin her yerinden hizli bir sekilde erisme imkanin olur hem de bu resmi ne kadar cok yerde kullanirsan kullan memoryde toplamda sadece 1 bitmap tutmus olursun.
Hocam benim temel problemim o 1 bitmapi bile bellekde tutmak istememem. yani free yapmak istiyorum.
peki yeni bir activity baslatirken oncekini finish() fonksiyonuyla bitiriyor musun? ya da yeni activity'ni startActivityForResult() fonksiyonuyla baslatip isin bitince geri ayni activity'e dondugune emin misin? kullandigin bitmapin boyutunu bilmiyorum fakat 1 tane bitmapin memory sismesine sebep olacagini sanmiyorum. isi biten fakat finish() yapilmamis activityler androidde memory sismesinin en buyuk sebeplerinden biridir. cunku arkaplanda calisan activityler kendi tuttugu resimlerin, objelerin garbage collector tarafindan temizlenmesini engeller.
hayır hocam finish yapmıyordum activity i. startActivityForResult ı da kullanmadım. ama finish i denedim.. direk olarak memory monitor de bir değişim yok. garbage collector sonradan siler mi bilmiyorum?
@MhmdAlmz anladım hocam.