2016-03-16 2 views
0

В соответствии с найденной документацией here, BackgroundPowerSaver должен быть членом экземпляра в вашем классе Application.Altbeacon BackgroundPowerSaver свойство

import org.altbeacon.beacon.powersave.BackgroundPowerSaver; 

public class MyApplication extends Application { 
    private BackgroundPowerSaver backgroundPowerSaver; 

    public void onCreate() { 
     super.onCreate(); 
     backgroundPowerSaver = new BackgroundPowerSaver(this); 
    } 
} 

Это, конечно, создает Field can be local предупреждение.


Мой вопрос: почему он должен быть членом экземпляра?

С его помощью registers on the Application приложение добавляет BackgroundPowerSaver к своему mActivityLifecycleCallbacks ArrayList. (См. Исходный код приложения для этого)

Если я не ошибаюсь, это должно означать, что приложение сохраняет ссылку на BackgroundPowerSaver и не должно быть GC'ed.

Итак, не должно ли оно работать, если вы это сделаете?

public void onCreate() { 
    super.onCreate(); 
    new BackgroundPowerSaver(this); 
} 

ответ

1

Что-то должно содержать ссылку на экземпляр BackgroundPowerSaver, чтобы сохранить его от мусора в виртуальной машине. Если вы хотите, чтобы удалить предупреждение, вы можете просто добавить @SuppressWarnings аннотацию:

@SuppressWarnings("unused") 
// Need to hold a reference to prevent garbage collection 
private BackgroundPowerSaver backgroundPowerSaver 

EDIT: фоновая заставка питания, используемый, чтобы иметь различные конфигурируемые внутренние реализации, только один из которых используются для Android ActivityLifecycleCallbacks. По этой причине когда-то нужно было иметь ссылку. Последняя версия всегда использует эту технику, поэтому больше нет причин держать ссылку.

Внизу, код, указанный в вопросе, будет работать нормально.

+0

Но разве приложение не ссылается на него в массиве ArrayList 'mActivityLifecycleCallbacks'? – SnyersK

+0

Спасибо за разъяснение! – SnyersK

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