2016-04-07 34 views
3

ben bir ilerleme çubuğu bir android countDownTimer her 100 ms den (setProgress() ile) güncellenmektedir var sızdırıyor. Herhangi bir nedenden ötürü, zamanlayıcı her çalıştığında, android bellek grafiğinde, bir bellek sızıntısı var gibi görünüyor (Sürekli bir artış). Bunun neden olduğuna dair bir fikrin var mı?Android ilerleme çubuğu bellek

final int waitTime = Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) 
      .getString("answer_view_time", "2000")); 
    final int countFrom = timerWidget.getProgress(); 
    CountDownTimer answerTimer = new CountDownTimer(waitTime, 100) { 
     @Override 
     public void onTick(long millisUntilFinished) { 
      //count up the time for the user to see his answer from where the timer had just left off 
      timerWidget.setProgress(countFrom +(int) ((((waitTime - millisUntilFinished))/(float) waitTime) 
        * (timerWidget.getMax() - countFrom))); 
     } 

     @Override 
     public void onFinish() { 
      mQuiz.next(); 
      setQuestion(mQuiz.getCurrent()); 

      btn1.setEnabled(true); 
      btn2.setEnabled(true); 
      btn3.setEnabled(true); 
      btn4.setEnabled(true); 

      findViewById(R.id.main_conteiner).setBackgroundDrawable(getResources().getDrawable(R.drawable.background_colored)); 
     } 
    }.start(); 

Bu, timerWidget.setProgress (...); hat. Bunu açıklarsam sızıntı durur.

Güncelleme: Bunun olması için bir neden bulamıyorum. Bir etkinlikte bile, ilerleme çubuğunu bir döngüde güncellerken bir bellek sızıntısı var gibi görünüyor. Belki de Android'de bir hata mıdır? Bir Lenovo cihazında Android 5.1 kullanıyorum. Sahip

+0

O yüzden bazı kodunu görmek güzel olurdu. –

+0

Haklısınız. Mesajımı düzenledim –

+0

Süreölçer nasıl bildiriliyorsunuz? –

cevap

2

bir problem anonim countDownTimer sınıfı o (değişkenler countFrom ve WAITTIME) ilan edildi sınıfa bir referans olmasıdır. Bu, dış sınıfın CountDownTimer var olduğu sürece asla çöp toplamayacağı anlamına gelir. senin bunu açıkça Aktivite/Parçasının countDownTimer OnPause veya OnDestroy öldürme Değilse, çöp zamanlayıcıyı yeniden her zaman toplanır asla birçok Dış Sınıf ve Anonim countDownTimer referanslara sahip olacak.

Adsız sınıfınızda countFrom ve waitTime başvuruları kullanmayın (bunun yerine getCountFrom() işlevini oluşturun, getWaitTime()) - mQuiz, btn1 vb. Için aynıdır. Sınıf değişkenlerini doğrudan anonim sınıfınızın dışına gönderme.

fazla bilgi için

- http://blog.nimbledroid.com/2016/05/23/memory-leaks.html

[İç Sınıflar] Devam ediyoruz, en biz İç Sınıf olarak bilinen bizim etkinlik'ın sınıfının, tanımı içinde bir sınıf tanımlamak diyelim. Programcı, okunabilirliği ve kapsüllemeyi arttırmak gibi bir dizi nedenden dolayı bunu yapmayı seçebilir. Ya bu İç Sınıfın bir örneğini yaratırsak ve ona statik bir referans verirsek? Bu noktada, sadece bir bellek sızıntısının yakın olduğunu tahmin edebilirsiniz.

[Anonim sınıfları] Benzer şekilde, Anonim sınıfları ayrıca içinde bildirilen edildi sınıfına ilişkin bir referansın koruyacaktır. Bu nedenle, bir AsyncTask'ı Etkinliğinizin içinde anonim olarak bildirir ve örneklendirirseniz, bir sızıntı oluşabilir. Etkinlik yok edildikten sonra arka plan çalışması yapmaya devam ederse, Etkinlik referansı devam eder ve arka plan görevi tamamlanıncaya kadar çöp toplanmayacaktır.

+0

Artık bu proje için kaynak kodum yok, bu yüzden bunu test edemiyorum - bu soruyu sorduğumdan bir yıl geçti. Cevabınız için teşekkürler, bilmek güzeldir. –