【问题标题】:Memory Leak on using PhoneStateListener使用 PhoneStateListener 的内存泄漏
【发布时间】:2017-05-06 12:44:04
【问题描述】:

我正在尝试使用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 的内存泄漏。

sendAbort() 是我的活动中的方法,它执行的操作很少。

有人可以指导我如何处理这个问题吗?我正在为内存管理而苦苦挣扎。

【问题讨论】:

标签: android memory memory-leaks phone-state-listener leakcanary


【解决方案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;
}

我在 onDestroy 方法中将 phoneStateListener 设置为 null。

对我来说,这不再造成内存泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-19
    • 2012-05-05
    • 1970-01-01
    • 2012-03-24
    • 2019-09-14
    • 2011-06-11
    • 2011-07-27
    • 2018-06-01
    相关资源
    最近更新 更多