I've written a simple test where I have:
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.hide(_sv);
ft.commit();
When the fragment gets hidden - onPause doesn't get fired. However, system 
fires a chain of callbacks up to onDestroyView when I use a replace method. 
So, I guess, I should be performing memory-recycling operations in 
onDestroyView method.

I've also noticed that when I hide the ViewPager component with 
setVisibility(GONE) its' fragments dont fire onPause callback. Is there any 
workaround to tell all the  fragments inside the ViewPager to clean 
themselves with onDestroyView ?

I still think I should use fragments since in a Tablet version those pages 
are implemented as tabs.

Thanks again and I was wondering whether you could point out or give some 
links on implementing the memory management process. I have a lousy 
knoweledge about WeakReferences, recycle(), System.gc() features but I 
guess they are somewhat mutually-excluding. Probably, I should stick to 
Weak/Soft references approach, should I ? If so - could you share some 
insights/give link on the whole process of instantiating bitmap down to the 
recycling.

On Sunday, July 29, 2012 12:28:08 AM UTC+3, Dianne Hackborn wrote:
>
> If you have a fragment that holds on to a lot of memory in its view 
> hierarchy and are concerned about this, then use 
> FragmentTransaction.remove() to make it no longer visible -- that will 
> remove it from its parent view and destroy its view hierarchy, so it 
> doesn't hold on to any references.  (If you are manually loading bitmaps in 
> the fragment, in onDestroyView() you can clear the references there.)  Of 
> course this means a bit more overhead when the user returns to the 
> fragment, since its view hierarchy needs to be re-inflated and initialized 
> again.  But it won't be any worse than the first time the user visited it, 
> and you need that to be fast as well.
>
> It is true that FragmentTransaction.hide() does not remove and the destroy 
> the fragment's view hierarchy, just doing View.setVisibility().  But that 
> is not all -- it takes care of managing the fragment lifecycle so that 
> fragment will be paused and stopped (since it is no longer visible).  You 
> can implement the lifecycle to free up resources if you need to.  This will 
> also result in them being freed when the entire activity is stopped, which 
> is probably what you want as well.
>
> You shouldn't be directly hiding the view associated with a fragment. 
>  That is what FragmentTransaction.hide/show() is for.  There is no need to 
> directly hide the view owned by it, and doing so means that you are letting 
> the correct fragment semantics execute.  (And for what it's worth, if you 
> have no reason to use fragments with ViewPager, there is nothing forcing 
> you to -- you can write your own adapter that directly manages raw views 
> and doesn't use fragments at all.)
>
> On Sat, Jul 28, 2012 at 1:45 PM, Dmitriy F <[email protected]> wrote:
>
>> Thanks for the answers! Would you mind to suggest on the part about 
>> fragments, bitmaps and memory management ? I decided to implement the app 
>> with 3 activities and about 8 fragments. The fragment number might slightly 
>> increase yet I think it's not the fragments but their bitmaps that gonna 
>> cause troubles with memory. 
>>
>> For displaying the fragments I have two containers: a ViewPager(rotates 
>> 3-4 fragments) element and a FrameLayout(displays strictly one fragment) 
>> element. Right now I'm simply hiding one type of container and showing 
>> another - setVisibility or fragmentTransaction.hide (I haven't figured out 
>> what is the difference between these two apart from the latest gives an 
>> ability of adding to activity's backstack). Is their any better way of 
>> switching between the containers ?
>>
>> Additionally, even if those fragments might not hold much memory by 
>> themselves - should I wrap those objects with SoftReference ?
>>
>> Could you tell any precautions/advices for implementing an app with such 
>> structure ? Thanks.
>>
>>
>> On Saturday, July 28, 2012 9:36:27 PM UTC+3, Romain Guy (Google) wrote:
>>
>>> 1) Does ImageView.SetImageResource applied against the same id twice or 
>>>> thrice consumes memory for the same bitmap or uses a separate range for 
>>>> every imageview element ?
>>>>
>>>
>>> I don't quite understand your question. When a Bitmap is loaded as a 
>>> Drawable (which is what ImageView does), it gets cached by the system 
>>> (using weak references.) This means that if do this:
>>>
>>> Drawable d1 = loadDrawable(R.drawable.**myImage);
>>> Drawable d2 = loadDrawable(R.drawable.**myImage);
>>>  
>>> you will get 2 different instances of Drawable, but the underlying 
>>> Bitmap will be loaded in memory only once.
>>>
>>> 2) same as 1. but for BitmapFactory.decodeResource
>>>>
>>>
>>> Every time you call this method you will load a new instance of a Bitmap 
>>> object, which means you will use more memory.
>>>  
>>>
>>>> 3) What part of Bitmap object consumes the most memory. If it's 
>>>> "backbone memory object" than what is it ? Where can I elucidate the 
>>>> structure of bitmap memory for myself ?
>>>>
>>>
>>> A Bitmap is backed by a byte array containing all the pixels. This is 
>>> what consumes the most memory. As of Android 3.0, this byte array can be 
>>> found in Bitmap.java, in previous versions of the platform the pixel 
>>> storage exists on the native side (you'd have to investigate SkBitmap.cpp.) 
>>>
>>> -- 
>>> Romain Guy
>>> Android framework engineer
>>> [email protected]
>>>
>>>   -- 
>> You received this message because you are subscribed to the Google
>> Groups "Android Developers" group.
>> To post to this group, send email to [email protected]
>> To unsubscribe from this group, send email to
>> [email protected]
>> For more options, visit this group at
>> http://groups.google.com/group/android-developers?hl=en
>>
>
>
>
> -- 
> Dianne Hackborn
> Android framework engineer
> [email protected]
>
> Note: please don't send private questions to me, as I don't have time to 
> provide private support, and so won't reply to such e-mails.  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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to