2012-05-25 1 views
4

хорошо большинство из нас знаком с этим рисунком:Приложение для 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 не равен нулю после деятельности с использованием его были уничтожен или когда все приложения предполагают, чтобы быть пунктом, например:

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 все еще держит ту же ссылку, с те же значения на его полях.

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

Что мне не хватает?

когда сборщик стальных элементов андроид-мусора относится к приложению?

+0

Где вы проверяете, что синглтон - это тот же самый экземпляр? –

+0

@Jazzy Josh: вы можете увидеть это просто, получив значение перед установкой нового.в моем примере это будет между методом getInstance, до следующей строки. просто нужно проверить, что он не равен нулю, потому что первый запуск значения будет по-прежнему нулевым. –

+0

Я конкретно подразумеваю, где в приложении. Если ваша активность никогда не будет убита, вы перейдете с onStop на onRestart и onStart, а не пройдете onDestroy и будете убиты, а ваш Синглтон все равно будет жив. –

ответ

5

Поскольку «mInstance» представляет собой статическую переменную, она не получит значение null при закрытии приложения. Закрытие приложения не означает, что ваше приложение было уничтожено.

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

+3

Этот ответ неверен, если память заполнена, android os решает эвакуировать свое приложение, тогда эта переменная WUL будет равна нулю а также в следующий раз, когда он попытается его использовать. –

+0

Спасибо @OfekRon за исправление. Ответ обновлен. – rizzz86

2

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

+0

, так значит ли это, что если я ожидаю, что мой класс singelton будет пустым, когда будет создано какое-то действие - мне нужно установить его как null в методе onDestroy() или что-то в этом роде? –

+0

@ Тан Канель Да. Но странно, что вы хотите уничтожить синглтон, поскольку синглтоны должны представлять что-то, что всегда существует. Возможно, у вас могут быть какие-то методы open()/close()/isOpened() в вашем singleton или, возможно, это должна быть Служба. –

+0

yah, вы правы, вот что я делаю, но я попросил его больше для принципа. –

0

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

Что мне не хватает?

когда сборщик стальных элементов андроид-мусора относится к приложению?

Хорошо, как утверждают другие, на Android не существует тесной концепции приложения, поскольку ОС Android управляет жизненным циклом вашего прикладного процесса самостоятельно.

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^