2015-05-26 2 views
3

Iv'e был в интервью, что должно быть неправильно со следующим?Интервью - Android-код

Я могу предположить, что проблема заключается в том, что вы не можете проверить, является ли класс нулевым?! Спасибо!

public class NiceActivity extends Activity { 

    private static AmazingClass a; 

    class AmazingClass { 
     int x; 
     int y; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_nice); 
     if (a == null) { 
      a = new AmazingClass(); 
     } 
    } 
} 
+1

это может сделать просачиваться деятельность – Blackbelt

+1

Вы можете иметь утечку памяти – GVillani82

+0

плюс 'a' удивительный класс не обязательно синглтон, как и ожидалось (?), Так как он может быть создано несколько раз на каждом' onCreate' –

ответ

4

Внутренний класс не является статичным, что может привести к его оживлению активности, все еще имеющему ссылку на него. Это может привести к утечке активности.

В этой статье объясняется эта проблема более подробно: http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html

1

В качестве внутреннего AmazingClass класса не является статическим, каждый экземпляр имеет неявную ссылку на внешний класс (NiceActivity).

Класс NiceActivity имеет ссылку на AmazingClass, и эта ссылка никогда не очищается.

Следовательно, активность никогда не будет собираться с мусором, и произойдет утечка памяти.

В схеме, которая будет примерно выглядеть следующим образом:

root GC -1-> Activity class -2-> Amazing object -3-> Activity object 

номер 2 или 3 ссылки должны быть очищены, чтобы избежать такой утечки.

+0

В Java нестатические внутренние и анонимные классы содержат неявную ссылку на свой внешний класс. С другой стороны, статические внутренние классы - нет. То, что вы написали, возможно, наоборот. –

+0

Вот что я имел в виду, можете ли вы сказать мне, какое из предложений не ясно? – Gordak

+0

Класс NiceActivity имеет ссылку на AmazingClass. Это то, что вы написали. Но я думаю, что вы хотели сказать: The AmazingClass имеет ссылку на NiceActivity. –

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