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

次のように私の着信クラスが同じ活動に内部クラスとして定義されています

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

onDestroyメソッドでphoneStateListenerをnullに設定しました。

私にとっては、これはもはやメモリリークを引き起こしません。

関連する問題