2010-12-12 1 views
39

Я новичок в разработке java! Может кто-нибудь скажет мне ... согласно которой логика super.onDestroy(); в деструкторах идет сверху? например:Почему super.onDestroy() в java - Android стоит на вершине в деструкторах?

protected void onDestroy() {   
    super.onDestroy(); 
    releaseMediaPlayer(); 
} 

и не

protected void onDestroy() {   
    releaseMediaPlayer(); 
    super.onDestroy(); 
} 

как C++, Obj-C, паскаль, и т.д. ??

ответ

53

Это действительно зависит от того, что вы хотите сделать в своем onDestroy. Это то, что делает super.onDestroy (в указанном порядке):

  • Отклонить любые диалоги, которыми занималась деятельность.
  • Закройте все курсоры, которыми управляла деятельность.
  • Закройте все открытые поиска диалоговое

Если логика вы положили внутри onDestroy что-то делать с этими тремя вещами, которые Android делает, то вам, возможно, придется беспокоиться о заказе. В противном случае, и в большинстве случаев это не имеет значения.

+1

Где вы нашли эту информацию? мне интересно об услугах и т. д. –

+1

Android - это OpenSouce ... просто взгляните на исходный код: P – Cristian

5

Что вы хотите сказать? Вы можете сделать это в любом случае, это зависит от того, хотите ли вы, чтобы ваш суперкласса onDestroy() вызывается перед вашим. Обычно я не думаю, что это важно в андроиде.

Также onDestroy() не является деструктором. Это фактически не уничтожает объект. Это просто метод, который называется на основе определенного состояния. Таким образом, ваш экземпляр все еще жив и очень хорошо * после того, как суперклассы onDestroy() запускается и возвращается.

* Скорее всего, андроид может убить всю деятельность в любое время, но вы можете предположить, что она все еще там.

+4

в C++, например, вы уничтожаете суперкласс после того, как закончите с вашими частными объектами. если вы сначала уничтожаете суперкласс, я не думаю, что это хорошая практика, я даже думаю, что приложение потерпит крах, так как экземпляр будет уничтожен! – Vassilis

+0

По его словам, это не деструктор, просто говорящий компоненту очистить любое состояние, в котором он хочет. Объект все еще остается после вызова onDestroy(). Как правило, порядок не имеет значения и не приведет к сбою. – hackbod

6

В ThreadSample.zip на Reporting Work Status training, есть комментарий в OnDestroy()

public void onDestroy() { 
    ... 
    // Must always call the super method at the end. 
    super.onDestroy(); 
} 

Так что, возможно при использовании радиоприемников, супер должны идти в конце.

+2

Это имеет смысл. Если вы хотите сделать что-либо *, вы, конечно же, не хотите делать это на полуразрушенном (очищенном) объекте. – vbence

2

Поскольку мы расширяемся от базовых классов андроида, это всегда хороший подход, позволяющий родительскому классу создавать и инициализировать себя во время создания и позволять ребенку инициализировать и освобождать ресурс во время остановки/остановки компонентов. Это рекомендуемый подход. однако это полностью зависит от вариантов использования и сценариев.

public void onCreate(Bundle bundle){ 
    super.onCreate(bundle); 
    //perform child class initializations. 
} 

public void onDestroy(){ 
    //perform uninitialization and free resource 
    super.onDestroy(); 
}