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();
}
...
}
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.
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.
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