[android-developers] Re: PhoneStateListener memory leak

2009-09-08 Thread Romain Guy

When you do this kind of test, you should force GCs on the system
process with DDMS, then force GCs in your process and then check how
many activities you have running.

On Tue, Sep 8, 2009 at 10:57 AM, Flying Coder wrote:
>
>
> There appears to be a leak when using PhoneStateListeners.  The
> following code simply reigsters in onResume and unregisters in onPause
> a PhoneStateListener.  Repeatedly launch then press BACK (so the app
> is finished & onDestory is called before the next launch) and the
> number of activities reported by meminfo will equal the number of
> launches.  For instance, here is the output I get after launching (and
> finishing) 11 times in sequence:
>
> dumpsys meminfo com.example.leak
> Currently running services:
>  meminfo
> ---
> DUMP OF SERVICE meminfo:
> Applications Memory Usage (kB):
> Uptime: 12204322 Realtime: 12204322
>
> ** MEMINFO in pid 1358 [com.example.leak] **
>                    native   dalvik    other    total
>            size:     2648     3079      N/A     5727
>       allocated:     2604     2254      N/A     4858
>            free:       43      825      N/A      868
>           (Pss):      913     1305     1475     3693
>  (shared dirty):     1080     3864      568     5512
>    (priv dirty):      808      936     1056     2800
>
>  Objects
>           Views:       77        ViewRoots:        1
>     AppContexts:       12       Activities:       11
>          Assets:        2    AssetManagers:        2
>   Local Binders:       36    Proxy Binders:       21
> Death Recipients:        0
>  OpenSSL Sockets:        0
>
>  SQL
>            heap:        0          dbFiles:        0
>       numPagers:        0   inactivePageKB:        0
>    activePageKB:        0
> #
>
> Without the PhoneStateListener, the number of activities is always 1
> no matter how many times the app is launched & finished.  So, am I
> doing anything wrong here?  Or is this a bug in the
> TelephonyManager?
>
> Thanks,
> Steve
>
>  here's the code
> package com.example.leak;
>
> import android.app.Activity;
> import android.content.Context;
> import android.os.Bundle;
> import android.telephony.PhoneStateListener;
> import android.telephony.TelephonyManager;
> import android.util.Log;
>
> public class LeakExample extends Activity {
>
>        private class MyPhoneStateListener extends PhoneStateListener {
>               �...@override
>                public void onCallStateChanged(int state, String 
> incomingNumber) {
>
>                        if ((state == TelephonyManager.CALL_STATE_RINGING)
>                                        || (state == 
> TelephonyManager.CALL_STATE_OFFHOOK)) {
>                                LeakExample.this.finish();
>                        }
>                }
>        }
>
>        MyPhoneStateListener phone_listener = new MyPhoneStateListener();
>
>        TelephonyManager telMgr ;
>
>   �...@override
>    public void onCreate(Bundle savedInstanceState) {
>        super.onCreate(savedInstanceState);
>        setContentView(R.layout.main);
>
>        telMgr = (TelephonyManager) getSystemService
> (Context.TELEPHONY_SERVICE);
>    }
>
>       �...@override
>        protected void onPause() {
>                super.onPause();
>
>                telMgr.listen(phone_listener, PhoneStateListener.LISTEN_NONE);
>        }
>
>       �...@override
>        protected void onResume() {
>                super.onResume();
>
>                telMgr.listen(phone_listener, 
> PhoneStateListener.LISTEN_CALL_STATE);
>        }
>
>       �...@override
>        protected void onDestroy() {
>                super.onDestroy();
>
>                Log.v("LEAK EXAMPLE", "onDestory");
>        }
>
>
>
> }
>
>
> >
>



-- 
Romain Guy
Android framework engineer
romain...@android.com

Note: please don't send private questions to me, as I don't have time
to provide private support.  All such questions should be posted on
public forums, where I and others can see and answer them

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~--~~~~--~~--~--~---



[android-developers] Re: PhoneStateListener memory leak

2009-09-08 Thread Flying Coder


Ugh -- yep, that was the problem.  Thanks! :-)



On Sep 8, 2:04 pm, Romain Guy  wrote:
> When you do this kind of test, you should force GCs on the system
> process with DDMS, then force GCs in your process and then check how
> many activities you have running.
>
>
>
>
>
> On Tue, Sep 8, 2009 at 10:57 AM, Flying Coder wrote:
>
> > There appears to be a leak when using PhoneStateListeners.  The
> > following code simply reigsters in onResume and unregisters in onPause
> > a PhoneStateListener.  Repeatedly launch then press BACK (so the app
> > is finished & onDestory is called before the next launch) and the
> > number of activities reported by meminfo will equal the number of
> > launches.  For instance, here is the output I get after launching (and
> > finishing) 11 times in sequence:
>
> > dumpsys meminfo com.example.leak
> > Currently running services:
> >  meminfo
> > ---­
> > DUMP OF SERVICE meminfo:
> > Applications Memory Usage (kB):
> > Uptime: 12204322 Realtime: 12204322
>
> > ** MEMINFO in pid 1358 [com.example.leak] **
> >                    native   dalvik    other    total
> >            size:     2648     3079      N/A     5727
> >       allocated:     2604     2254      N/A     4858
> >            free:       43      825      N/A      868
> >           (Pss):      913     1305     1475     3693
> >  (shared dirty):     1080     3864      568     5512
> >    (priv dirty):      808      936     1056     2800
>
> >  Objects
> >           Views:       77        ViewRoots:        1
> >     AppContexts:       12       Activities:       11
> >          Assets:        2    AssetManagers:        2
> >   Local Binders:       36    Proxy Binders:       21
> > Death Recipients:        0
> >  OpenSSL Sockets:        0
>
> >  SQL
> >            heap:        0          dbFiles:        0
> >       numPagers:        0   inactivePageKB:        0
> >    activePageKB:        0
> > #
>
> > Without the PhoneStateListener, the number of activities is always 1
> > no matter how many times the app is launched & finished.  So, am I
> > doing anything wrong here?  Or is this a bug in the
> > TelephonyManager?
>
> > Thanks,
> > Steve
>
> >  here's the code
> > package com.example.leak;
>
> > import android.app.Activity;
> > import android.content.Context;
> > import android.os.Bundle;
> > import android.telephony.PhoneStateListener;
> > import android.telephony.TelephonyManager;
> > import android.util.Log;
>
> > public class LeakExample extends Activity {
>
> >        private class MyPhoneStateListener extends PhoneStateListener {
> >               �...@override
> >                public void onCallStateChanged(int state, String 
> > incomingNumber) {
>
> >                        if ((state == TelephonyManager.CALL_STATE_RINGING)
> >                                        || (state == 
> > TelephonyManager.CALL_STATE_OFFHOOK)) {
> >                                LeakExample.this.finish();
> >                        }
> >                }
> >        }
>
> >        MyPhoneStateListener phone_listener = new MyPhoneStateListener();
>
> >        TelephonyManager telMgr ;
>
> >   �...@override
> >    public void onCreate(Bundle savedInstanceState) {
> >        super.onCreate(savedInstanceState);
> >        setContentView(R.layout.main);
>
> >        telMgr = (TelephonyManager) getSystemService
> > (Context.TELEPHONY_SERVICE);
> >    }
>
> >       �...@override
> >        protected void onPause() {
> >                super.onPause();
>
> >                telMgr.listen(phone_listener, 
> > PhoneStateListener.LISTEN_NONE);
> >        }
>
> >       �...@override
> >        protected void onResume() {
> >                super.onResume();
>
> >                telMgr.listen(phone_listener, 
> > PhoneStateListener.LISTEN_CALL_STATE);
> >        }
>
> >       �...@override
> >        protected void onDestroy() {
> >                super.onDestroy();
>
> >                Log.v("LEAK EXAMPLE", "onDestory");
> >        }
>
> > }
>
> --
> Romain Guy
> Android framework engineer
> romain...@android.com
>
> Note: please don't send private questions to me, as I don't have time
> to provide private support.  All such questions should be posted on
> public forums, where I and others can see and answer them- Hide quoted text -
>
> - Show quoted text -
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~--~~~~--~~--~--~---