Жизненный цикл приложения для Android и singelton



Ну, большинство из нас знакомы с этой моделью:



   public class MySingeltone {

public String mSomeReferenceTypeData;
public int mSomeValueTypeData;

private static MySingeltone mInstance;

private MySingeltone() {

}

public static MySingeltone getInstance() {
if (mInstance == null) {
mInstance = new MySingeltone();
}

return mInstance;
}
}


Моя проблема заключается в том, что я недавно обнаружил, что mInstance не равняется null после того, как активность, использующая его, была уничтожена, или когда все приложение предположило, что это предложение, например:



public class SomeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

MySingeltone mySingeltone = MySingeltone.getInstance();
mySingeltone.mSomeReferenceTypeData = "some value";
}
}


При запуске "SomeActivity" в следующий раз после закрытия всех приложений, выполняющих действия (скажем, через 10 секунд после..) mInstance все еще держит ту же ссылку, с теми же значениями на его полях.



Почему это происходит происходит?



Что я упускаю?



Когда Android-сборщик мусора статических членов принадлежит приложению?

585   3  

3 ответов:

Так как "mInstance" является статической переменной, она не получит null при закрытии приложения. Закрытие приложения не означает, что ваше приложение было уничтожено.

Также нет концепции закрытия вашего Android-приложения. Если вы выйдете из вашего приложения, оно не будет уничтожено одновременно. ОС Android обрабатывает его внутренне, когда нужно закрыть приложение, когда оно больше не используется. В случае нехватки памяти, когда android решит уничтожить приложение, то эта статическая переменная также будет получена нулевой.

Вы не можете контролировать, когда именно объекты Java становятся собранным мусором. Объект становится пригодным для сборки мусора, когда на него больше нет (некруглых) ссылок. С Android, далее, вы не можете контролировать, когда ваша деятельность удаляется из памяти.

Почему это происходит?

Что я упускаю?

Для Андроид мусор собирать статические члены принадлежат к применению?

Во-первых, как говорили другие, на Android нет концепции близкого приложения, поскольку ОС android управляет жизненным циклом вашего процесса приложения самостоятельно.

Во-вторых, вы сделали неправильный тест - если вместо закрытия всех приложений вы сделаете обратное-то есть-заполните память, запуская все больше и больше приложений, то в конечном итоге память вашего приложения будет очищена для использования другими приложениями, и это включает в себя все статические mebers, а также члены экземпляра! затем вы увидите, что статическая переменная будет NULL, как вы и ожидали.

Они просто "лениво" очищают память, Если памяти достаточно, то ваше приложение может никогда не очиститься.

На самом деле, нет никакого способа обойти это, насколько я знаю, нет никакого способа захватить объект, который не был бы очищен в любой точке от память устройства. в некоторых случаях это приводит к плохому поведению. например, если синглтон выполняет тяжелую обработку при его создании, вызов getInstance может привести к зависанию пользовательского интерфейса или даже к сбою приложения из-за безответственности.

Comments

    Ничего не найдено.