Утечка памяти при использовании PhoneStateListener

Я пытаюсь использовать PhoneStateListener для уведомления моего приложения, когда срабатывает входящий вызов, чтобы выполнить какое-либо действие. Я регистрирую свой метод PhoneStateListener в onResume() своей деятельности следующим образом.

    @Override
    protected void onResume() {
     super.onResume();
     tmgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
     incomingCallListener=new IncomingCallListener();
     tmgr.listen(incomingCallListener, phoneStateListener.LISTEN_CALL_STATE);
    }

onPause() метод моей деятельности я удаляю слушателя, используя следующий код.

     @Override
     protected void onPause() {
       super.onPause();
        incomingCallListener=null;
        tmgr.listen(incomingCallListener, PhoneStateListener.LISTEN_NONE);
        tmgr=null;
     }

Мой входящий класс определяется как внутренний класс в том же действии следующим образом:

    public class IncomingCallListener extends PhoneStateListener {

      public IncomingCallListener() {
      }

      @Override
      public void onCallStateChanged(int state, String incomingNumber) {
        if (state == TelephonyManager.CALL_STATE_RINGING) {
            if (qInProgress) {
                if (qSource.equals(Loading.TYPE_FUN) || (qResumable)) {
                    //Allow to Resume
                } else {
                    //Break and send abort
                    sendAbort();
                }
            }

        }
      }
   }

Я использую LeakCanary lib для проверки утечки памяти, и я получаю утечку памяти в размере 6,1 МБ из-за своей активности.

Утечка памяти

sendAbort() - это метод в моей деятельности, который выполняет несколько операций.

Может ли кто-нибудь направить меня, как позаботиться об этой проблеме? Я борюсь с управлением памятью.


person Udit Shah    schedule 21.12.2016    source источник
comment
Получил некоторую идею отсюда stackoverflow.com/a/40539708/2006283   -  person Udit Shah    schedule 21.12.2016


Ответы (1)


Я нашел решение, которое перестало создавать утечку памяти.

private static PhoneStateListener phoneStateListener=new PhoneStateListener(){

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        if (state == TelephonyManager.CALL_STATE_RINGING) {
            if (st_qScreen.qInProgress) {
                if (st_qScreen.qSource.equals(Loading.TYPE_FUN) || (st_qScreen.qResumable)) {
                    //Allow to Resume
                } else {
                    //Break and send abort
                    st_qScreen.sendAbortQ();
                }
            }

        }
    }
};

Здесь st_qScreen — экземпляр текущего класса.

@Override
protected void onResume() {
    super.onResume();
     tmgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
     tmgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}


@Override
protected void onPause() {
    super.onPause();
    tmgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
    tmgr=null;
}

Я установил для phoneStateListener значение null в методе onDestroy.

Для меня это больше не создает утечки памяти.

person Udit Shah    schedule 21.12.2016