If the garbage collector deletes an object I have a "hard" reference
to, it's broken.  Doesn't matter if it runs in a different thread or a
different country.  Once I have executed ref() and stored the result
somewhere in my VM (in stack or in another object) that object cannot
be deleted until I overwrite the value.

On Jul 25, 7:19 pm, Indicator Veritatis <mej1...@yahoo.com> wrote:
> As the author of the IBM Developerworks article I referenced mentions,
> that is not good enough. The Garbage Collector runs on a different
> thread, you have no control over when it will be called. It is quite
> possible that just after you test for null, the GC is called, and it
> is no longer valid. Not likely, but possible.
>
> If instead you create a strong reference and use that, discarding it
> when done, then you have shut the door on a really nasty transient
> bug.
>
> Or perhaps the version of 'ref()' you found did this for you? What
> package did you find it it?
>
> On Jul 23, 5:21 am, DanH <danhi...@ieee.org> wrote:
>
> > Yes, you must "guard" any use of the WeakReference by taking the ref()
> > of it, testing that for null, and then proceeding to use the result of
> > the ref() if not null.  The size of the "guarded" sections is up to
> > the programmer -- if too large then the object will never get deleted,
> > if too small then the code gets chopped up.
>
> > On Jul 23, 1:37 am, Indicator Veritatis <mej1...@yahoo.com> wrote:
>
> > > You left out something very important: the code hidden under "//
> > > reload the image" must not assume that it is not itself interrupted by
> > > yet another call to the garbage collector. That is, instead of simply
> > > continuing to use the soft/weak reference, it should make a strong
> > > reference to the same object, allowing this latter reference to either
> > > go out of scope or be set to null when it is done.
>
> > > But if we are making this strong reference, what was the point of
> > > using the weak/soft reference in the first place? Ah, that is the
> > > tricky thing about using them. Depending on when you can make and
> > > release the strong reference, they might not buy you much; they might
> > > not buy you anything at all. That is why they are not recommended for
> > > much outside of caches and normalized mappings.
>
> > > On Jul 22, 11:07 am, Joseph Earl <joseph.w.e...@gmail.com> wrote:
>
> > > > Suppose you had a long list of images. As the user scrolled down you
> > > > load the images from the net, and then display them.
> > > > To avoid having to reload the images again if the user scrolls back
> > > > up, you put the images in a cache (probably something like a
> > > > Map<String, Drawable>)
>
> > > > However because it is a long list you don't want to run into an out of
> > > > memory situation if the user scrolls very far down and lots of images
> > > > are put in the cache.
> > > > So instead of storing the Drawables directly in the map, you create a
> > > > Map<String, WeakReference<Type>> (although I would use SoftReference
> > > > for the purpose described here).
> > > > This means that if Android is going to encounter an out of memory
> > > > situation it will clear all of the Soft/Weak references (and thus
> > > > hopefully avoid running out of memory). You will have to load the
> > > > images again since your cache has been cleared, but this is far better
> > > > than your application running out of memory and crashing.
>
> > > > So you do something like:
>
> > > > // caching an image
> > > > Map<String, SoftReference> cache = new HashMap<String,
> > > > SoftReference<Drawable>>();
> > > > cache.put("http://mysite.com/images/1.jpg";, new
> > > > SoftReference<Drawable>.put(myDrawable));
>
> > > > // retrieve an image
> > > > if (cache.containsKey(url)) {
> > > >    // looks like we have this image cached
> > > >    Drawable drawable = cache.get(url).get();
> > > >    if (drawable == null) {
> > > >        // the softreference has been cleared by the GC, reload the
> > > > image
> > > >    } else {
> > > >        // softreference is still valid, got our image
> > > >    }
>
> > > > }
>
> > > > Essentially a weak reference is a weaker reference than a soft
> > > > reference - the GC should free weak references to regain memory before
> > > > soft references.
>
> > > > I think that's (mostly) correct, hope it helps.
>
> > > > On Jul 22, 6:48 pm, GodsMoon <godsm...@gmail.com> wrote:
>
> > > > > Google just posted a new blog post 
> > > > > onhttp://android-developers.blogspot.com/2010/07/multithreading-for-per....
> > > > > I understand the AsyncTask and I'm even using one in a list with
> > > > > images already.
>
> > > > > But I don't understand what a WeakReference is. I gather is is a
> > > > > garbage collector directive, but I thought I didn't need to manage
> > > > > garbage collection on Android.
>
> > > > >http://developer.android.com/reference/java/lang/ref/WeakReference.html
> > > > > isn't as helpful as I was hoping it would be.

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

Reply via email to