Hirdetés

Új hozzászólás Aktív témák

  • Karma

    félisten

    válasz lordjancso #1221 üzenetére

    Semmi nagy dologra nem gondoltam, két dolgot változtatnék a példán a rend kedvéért:
    1) Ahogy nézem, nem használja fel az URLImageGetter a konstruktorban átadott Contextet, úgyhogy a tagváltozót és a paramétert törölném azonnal. Ha meg mégis kéne, akkor a View-tól kérném el.
    2) A container tagváltozója ugyanennek az osztálynak erősen kapaszkodik (hard reference) a View-ba, úgyhogy ha mondjuk a letöltés tíz percig tart, a felhasználó már régen továbbállt mert megunta, akkor se tudja a GC felszabadítani az egész Activityt.
    Könnyen elkerülhető, ha a container tagváltozó nem View, hanem WeakReference<View> típusú. Két sort kell módosítani hozzá, és máris nem akadályozza a GC-t – csak le kell ellenőrizni onPostExecute-ban, hogy megvan-e még a View, vagy már vége.

    public class URLImageParser implements ImageGetter {
    WeakReference<View> container;

    public URLImageParser(View t) {
    this.container = new WeakReference<View>(t);
    }

    public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> {
    URLDrawable urlDrawable;

    ...

    @Override
    protected void onPostExecute(Drawable result) {
    View c = URLImageParser.this.container.get();
    if (c == null) return;

    ...

    // redraw the image by invalidating the container
    c.invalidate();
    }

    ...
    }
    }

    [ Módosította: doc ]

Új hozzászólás Aktív témák