Использование EventBus для завершения действия из базового действия?

Работая над существующим проектом, я нашел довольно необычную реализацию (по крайней мере, для меня). Поскольку я не общаюсь с предыдущим разработчиком, который уже ушел, и прежде чем я отклоню это как случай простого копирования и вставки кода из другой части нашей кодовой базы, я хотел бы спросить об этом сообщество SO.

Вот ваша повседневная активность, расширяющая BaseActivity, и реализация:

class SomeActivity : BaseActivity(R.layout.some_activity) {
    ...
    private fun close() {
        if(backToMain)
            finish()
        } 
        else
            goToMain(this)
    }

    companion object {
        fun goToMain(activity: AppCompatActivity) {
            val intent = Intent(activity, MainActivity::class.java)
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
            activity.startActivity(intent)
            EventBus.getDefault().post(Event(Event.Type.ActivityFinish))
        }
    }
    ...
}

В BaseActivity.kt есть подписка на событие, вызывающее finish().

@Subscribe override fun onEvent(event: Event) {
    when (event.type) {
        Event.Type.ActivityFinish -> super.finish()
        else -> {}
    }
}

Теперь, зачем кому-то использовать EventBus для вызова Activity.finish() из расширенной BaseActivity вместо того, чтобы просто вызывать ее тут и там (в описанной выше SignActivity)? Даже если SomeActivity на самом деле является фрагментом, вы можете просто вызвать getActivity.finish().

* Что касается флагов намерения, вы также можете использовать Activity.finishAffinity()< /a> для завершения всех действий в заднем стеке, если ваш минимальный SDK равен 16.

Заранее спасибо за удовлетворение моего любопытства. :D


person Aba    schedule 03.08.2017    source источник
comment
это может быть сценарий, sign IN => signUp(on successful signup , kill signIN and take user to Someother screen) => Somesceen   -  person Pavneet_Singh    schedule 03.08.2017
comment
На самом деле это была бы законная ситуация. Однако это подразумевает связь между двумя действиями, а не между действием и его расширенной базой.   -  person Aba    schedule 03.08.2017


Ответы (2)


Обновление. Этот ответ был до того, как упоминалось, что проект использует минимальный уровень API 16.

Я просмотрел ваш код и думаю, что у разработчика были очень хорошие намерения. Он хочет очистить все действия из стека. Например, здесь он использовал FLAG_ACTIVITY_CLEAR_TOP или FLAG_ACTIVITY_NEW_TASK, но для этого требуется уровень API> 11.

Добавив подписку в BaseActivity, мы можем убедиться, что Activity больше не будет существовать после трансляции тега Event.Type.ActivityFinish с использованием EventBus. Этот метод будет работать как более безопасный подход, если вы думаете о случае выхода из системы, когда вы собираетесь очистить свой стек.

person Rahul    schedule 03.08.2017
comment
Что касается флагов намерения, вы можете просто вызвать Activity.finishAffinity(), и это будет, простыми словами, вызывать finish() для всех действий в заднем стеке. Итак, я не думаю, что это объясняет, почему вы должны использовать EventBus. - person Aba; 03.08.2017
comment
Снова Activity.finishAffinity появился после уровня API 16. Для получения дополнительной информации проверьте это " title="Activity Finishaffinity против активности флага намерения Активация флага намерения новой задачи"> stackoverflow.com/questions/33497151/ и я не думаю, что есть что-то плохое в использовании этого подхода для уничтожения действий. - person Rahul; 04.08.2017
comment
Пожалуйста, извините мое незнание уровня API. Да, ты прав. Флаги - это нормально (просто мой проект - это minSdk 16). Тем не менее, я не думаю, что это причина, по которой используется EventBus, потому что вы можете просто вызвать finish() в конце. - person Aba; 04.08.2017
comment
Если в вашем проекте используется минимум 16, о чем вы сейчас упомянули, то эти подписки не имеют смысла. - person Rahul; 04.08.2017
comment
Спасибо за ваш отзыв @Rahul: D - person Aba; 04.08.2017

Итак, вот с этим дело. Посмотрев пару раз на экран и поработав больше с кодовой базой, я обнаружил, что предыдущий разработчик на самом деле использовал функцию goToMain из других действий (люди действительно делают это? О_о). Тем не менее, поскольку объект «Активность» все еще передается, я не могу придумать причину для использования EventBus в этом конкретном сценарии (потому что вы можете просто вызвать activity.finish()).

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


Что такое EventBus?

EventBus – это оптимизированная для Android шина событий, которая упрощает взаимодействие между действиями, фрагментами, потоками, службами и т. д.

т. е. не запускать статический метод для вызова собственных расширенных функций действия.

person Aba    schedule 20.08.2017
comment
Так что писать комментарии очень важно :) - person BakaWaii; 20.08.2017
comment
@BakaWaii Действительно это так - person Aba; 22.08.2017