2015-10-03 2 views
2

У меня есть деятельность для регистрации пользователей. В какой-то момент в этой деятельности у меня есть фрагмент с регистрационной формой. Когда пользователь нажимает кнопку REGISTER У меня есть событие переданную с шиной событий, как этотАктивность уничтожена, не может отправить событие из содержащегося фрагмента

В RegistrationFragment (содержится в RegistrationActivity)

EventBus.getDefault().post(new RegistrationSuccessfulEvent()); 

В RegistrationActivity

public void onEvent(RegistrationSuccessfulEvent event) { 
    startActivity(new Intent(this, MainActivity.class)); 
} 

Я получаю это исключение

Could not dispatch event: class com.myapp.RegistrationSuccessfulEvent to subscribing class class com.myapp.RegistrationActivity ... 
java.lang.IllegalStateException: Activity has been destroyed 

Почему я нарушаю деятельность? Возможно ли, что если активность А содержит фрагмент F, то действие прекращается, а F все еще работает и работает? Я думал, что A жив, пока F жив, или какой-либо другой содержащийся фрагмент находится в рабочем состоянии. Я довольно смущен жизненным циклом связи активности и фрагмента.

+0

Я также сталкиваюсь с той же проблемой. Но я не уверен, что создает проблему. У меня есть фрагмент, фрагмент панели инструментов, внутри основного действия, откуда я отправляю событие, некоторое время, когда я запускаю и перезапускаю приложение, он выходит из строя с указанным выше сообщением. – ahmadalibaloch

ответ

1

Предполагая, что «живым» вы подразумеваете «созданный, но еще не разрушенный», жизненный цикл активности не зависит от внутренних фрагментов, хотя обратный может стоять.

Возможно, что в этот момент фрагмент был уничтожен (в смысле жизненного цикла), но он по-прежнему является экземпляром класса java, который еще не был собран мусором. Если это так, у него все еще есть возможность опубликовать Event. В строгом смысле, например, Activity has been destroyed не означает, что его экземпляр был собран - он просто прошел процесс уничтожения.

Возможно также, что вы используете setRetainInstance на своем фрагменте, что позволяет сохранить экземпляр фрагмента в активном состоянии, когда активность воссоздается.

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

+0

Под живым я подразумевал в ** Активном состоянии **, после того, как был вызван вызов ** onResume() **. В моем понимании, в то время как активность имеет ** Активные ** фрагменты внутри нее должны быть ** Активны **. Возможно, мне захочется получить некоторые данные из этого действия в фрагменте. Итак, вы говорите, что Фрагмент может находиться в состоянии ** Активно **, пока его активность в состоянии ** Разрушена **? – shadox

+0

Нет, я говорю, что неактивный класс (будь то Activity или Fragment или любой другой класс на основе Android на основе жизненного цикла) все еще может использовать методы, пока не будет собран мусор. С точки зрения Android они умирают 'onDestroy', но может быть небольшое (надеюсь) время, когда их экземпляр еще не равен нулю. – natario

+0

Итак, просто чтобы быть уверенным. Если Fragment активен, то активна активность, верно? – shadox

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