0

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

@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; 
    } 

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

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.1Mb из моя деятельность.

Memory Leak

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

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

+0

Получил некоторую идею отсюда http://stackoverflow.com/a/40539708/2006283 –

ответ

0

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

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 метод.

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

 Смежные вопросы

  • Нет связанных вопросов^_^