Является ли хорошей практикой сохранять экземпляр активности в 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
для вашей службы.
Теперь у вашей службы есть ссылка на ваши действия (выбранные). Получите доступ к данным через этот интерфейс и очистите ссылки после его использования.