2016-12-07 1 views
0

Если у меня есть вспомогательный класс, как в следующем:Пропустит контекст для вспомогательного класса при утечке активности андроида?

public class TestHelper { 
    private Context context; 

    public TestHelper(Context context); 
    this.context = context; 
    } 

    public doSomethingWithContext(){ 
    //some code 
    } 

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

public class MainActivity extends AppCompatActivity{ 
    private TestHelper helper; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     helper = new TestHelper(this); 
    } 

} 

Будет ли контекст будет утечка, как это, или я должен установить помощник обнулить в методе onDestroy (будет ли это работать даже для GC)?

Также мне нужен помощник в нескольких методах (onCreate, onPause и т. Д.), Поэтому создание Помощника внутри всех методов не похоже на хорошее решение.

+0

Этот excact код не вызовет утечку активности ... – Selvin

+1

Да, если ваш контекст сохранения в классе помощника, он будет просачиваться свой контекст. Он не будет собирать мусор. Никогда не делайте разыгрывания на onDestroy, потому что он не будет гарантированно вызван. Вместо этого вы можете установить значение null на onStop. – HendraWD

+0

@HendraWD какая утечка ... этот код (код из вопроса) не вызовет утечки ... контекст в вспомогательном классе не используется, а экземпляр вспомогательного класса - это поле в самой деятельности ... поэтому он «умрет» «с активностью ... **, но если он будет использовать контекст в вспомогательном классе, то установка вспомогательного экземпляра на null может оказаться недостаточной, чтобы избежать утечек активности ** – Selvin

ответ

1

Контекст не протекает в вашем коде, потому что GC правильно обрабатывает циклические ссылки. См. Пояснения here

-1

Сборщик мусора только для разыменования примитивов или встроенных типов данных. Если у вас есть пользовательские объекты в коде, как пользовательский класс или в данном случае Context вам придется вручную разыменования, чтобы избежать утечки памяти

Пример:

public class TestHelper { 

    private List<String> items = new ArrayList<>(); 
    private float floatValue = 0; 
    private String stringValue = ""; 

} 

При инициализации TestHelper testHelper = new TestHelper();. Система будет выделять память для вашего объекта testHelper. Каждый объект, такой как items, floatValue и stringValue имеет отдельные ячейки памяти, но как-то составлен в ссылке testHelper.

float и String: primitive data types, тогда как List<String> нет. Итак, теперь, когда вы делаете testHelper = null;, он будет разыменовывать float и String, но не List<String>. Для этого вам необходимо позвонить items.clear();, а затем позвонить по телефону items = null;.

Для получения более подробной информации clearing or set null to objects in java

+0

* Для этого вам нужно вызвать items.clear(), а затем вызвать items = null; * ...это неверно ... 'testHelper = null;' достаточно хорошо ... поскольку список элементов будет недоступен из любого корня – Selvin

+0

Ссылка, которую вы предоставили, не имеет ничего общего с примером из вашего ответа ... – Selvin

+0

http://ideone.com/tTmgb0 ther не является единственным элементом 'items.clear()' или 'items = null;' only 'helper = null;', но память находится на том же уровне ... если вы делаете // раскомментируйте это, чтобы сохранить ссылки, тогда вы увидите, что увеличение памяти, а затем после 'array = null;' будет уменьшено до начального состояния ... все: * Итак, когда вы выполняете testHelper = null; он будет разыменовывать float и String, но не List . Для этого вам нужно вызвать items.clear(), а затем вызвать items = null; * ** не верно ** – Selvin

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