Android: odwołania do kontekstu i wycieki pamięci

Czytałem, że jest to błąd i źródło wycieków pamięci w aplikacji na Androida, aby zachować długotrwałe odniesienia do kontekstu.

Ale nie rozumiem czy jest ok tworzyć klasę która wygląda jak Ta:

public class HelperClass {
    private Context context;

    public HelperClass(Context context) {
        this.context = context;
    }
    public void myHelperMethod() {
        // uses this.context
    }
}

I wywołaj to z aktywności:

public class MyActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        HelperClass h = new HelperClass(this);
        h.myHelperMethod();
    }

    ...
}
Author: Guido, 2010-07-27

2 answers

To jest w porządku i nie spowoduje wycieku pamięci.

Jak tylko onCreate zakończy wykonywanie, h będzie poza zasięgiem i będzie kwalifikować się do zbierania śmieci. Gdyby {[1] } było statyczne, wtedy napotkałbyś problemy. Tylko wtedy, gdy odniesienie do kontekstu przetrwa cykl życia samego kontekstu, wystąpi wyciek pamięci. Kilka pomocnych wskazówek:

  • Użyj Context.getApplicationContext(), jeśli to możliwe. Ten kontekst będzie trwał tak długo, jak długo Twoja aplikacja jest żywa.
  • bądź ostrożny, gdy korzystanie z pól statycznych i klas wewnętrznych.
  • Uruchom aplikację przez profiler , aby sprawdzić wycieki.
 43
Author: dbyrne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-27 17:42:22

Zakres klasy HelperClass jest tylko w twojej funkcji onCreate, więc po wykonaniu onCreate, Twój obiekt " h " nie jest już potrzebny i podlega zbieraniu śmieci.

Byłoby inaczej, gdyby "h" było członkiem statycznym - to byłby świetny sposób na wyciek pamięci.

 6
Author: EboMike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-27 17:20:44