Monday, January 14, 2013

Re: [android-developers] Correct way to implement Activity onDestroy()?

After spending considerable time looking at this issue, I strongly suggest that you look into an Intent Service, for any long running task.  Using AsyncTasks is just fraught.

First of all, onDestroy is only called best effort.  If you care about getting it done, you can't do it in onDestroy.  Further, as kris points out, onDestroy is, often, called just as your *process* is about to be destroyed.  Worrying about allocation of memory in your process, just as it is destroyed, is pretty pointless.

There are two issues you need to consider: making your program correct according to Java ("If mutable state is referenced from more than one thread, all references must take place holding a single lock" - B. Goetz, paraphrased).  You also have to be sure that the lifecycles of unmanaged objects (e.g. AsyncTasks) don't interfere with the lifecycles of managed objects (Activities).

Nulling out pointers and AsyncTasks that survive screen reorientation (despite the fact that I proposed it myself, at one point) are just Voodoo.

G. Blake Meike
Marakana

Programming Android 2ed is now in stores:
http://bit.ly/programmingandroid


On Monday, January 14, 2013 1:10:52 AM UTC-8, Greenhand wrote:
Thank you.
Another related question, in section "5. Implement a more intelligent AsyncTask dealing with screen orientation" of http://blog.doityourselfandroid.com/2010/11/14/handling-progress-dialogs-and-screen-orientation-changes/, it has private AsyncTaskComplex activity in ListFresher as a member variable. Shouldn't it be null out because it is not a static Activity references?
 

Kristopher Micinski於 2013年1月14日星期一UTC+8下午4時24分53秒寫道:
Basically, as long as you aren't hanging static Activity references
you should be fine.  The main activity will be thrown away upon its
destruction, at which point the Activity will be thrown away: along
with its contents.  Of course, if you're holding onto Views elsewhere
that's bad (i.e., don't hold static refs).

kris

On Mon, Jan 14, 2013 at 1:42 AM, Greenhand <coopera...@gmail.com> wrote:
> I read
> http://android-developers.blogspot.tw/2009/01/avoiding-memory-leaks.html
> about avoiding memory leaks.
> I would like to know whether I should null out all member variables, such as
> TextView and Button in onDestroy()? Or, unregistering listener, unbinding
> service and etc.in onDestroy() are enough to prevent memory leak?
>
> --

--
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+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

No comments:

Post a Comment