Является ли хорошей практикой сохранять экземпляр активности в WeakReference

0 Prabs [2017-05-24 16:35:00]

Здесь в этом ответе экземпляр Activity сохраняется в WeakReference<Activity>. Чтобы избежать утечек памяти. Это хорошая практика?

public class BackgroundService extends IntentService {
    private static WeakReference<Activity> mActivityRef; 

    public static void updateActivity(Activity activity) {
        mActivityRef = new WeakReference<>(activity);
    }
}

Я использую mActivityRef.get() и отбрасываю его на необходимый объект активности. Использование этого объекта, доступ к методам в деятельности.

Цель состоит в том, чтобы получить доступ к методам активности из службы, этот код выполняет работу, но в соответствии с комментариями я запутался, использовать ли это или нет

Я еще не назвал этот документ.

android android-activity weak-references intentservice


2 ответа


2 Решение CommonsWare [2017-05-24 16:38:00]

Это хорошая практика?

Нет.

Целью является доступ к методам активности из службы

Эта деятельность может не существовать. Например, пользователь может нажать BACK и уничтожить действие во время работы службы. Вызов методов разрушенного действия, скорее всего, приведет к сбоям.

Используйте шину событий (LocalBroadcastManager, greenrobot EventBus и т.д.) Для слабосвязанной связи между компонентами, например между службами и действиями. Регистрировать активность для событий, когда они видны, и при необходимости иметь сообщения о служебных сообщениях.


0 Haris Qureshi [2017-05-24 16:57:00]

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

Теперь у вашей службы есть ссылка на ваши действия (выбранные). Получите доступ к данным через этот интерфейс и очистите ссылки после его использования.