Поэтому я портировал личное приложение на поток и раствор, чтобы оценить его для использования в бизнесе. Я не столкнулся с сценарием, в котором у меня уже был весь жизненный цикл активности, но поскольку ситуация стоит с текущей версией потока (v0.4) & mortar (v0.7), это то, что я думаю, вам придется творчески решать для себя. Я осознал это как потенциальную проблему для себя и подумал о том, как ее преодолеть:
Я также хотел бы отметить, что я фактически не использовал SDK для Facebook. Вам нужно будет выбрать лучший метод для себя.
- Вы можете публиковать события из активности для каждого события жизненного цикла. Вы, по сути, упоминали этот подход, используя RXJava 's Observables. Если вы действительно хотели использовать RXJava, для этого вы могли бы использовать PublishSubject, но я бы, вероятно, пошел с простыми событиями из EventBus, на которые вы могли подписаться. Это, наверное, самый простой подход.
- Вы также можете, в зависимости от того, как работает SDK Facebook, возможно, введет компонент Facebook SDK в свою деятельность и оттуда его инициализирует. Затем добавьте компонент Facebook SDK в свой вид, который будет использоваться. Система Flow и Mortar полностью интегрирована в инъекцию зависимостей в конце концов? Этот подход также довольно прост, но в зависимости от того, как работает SDK в Facebook, вероятно, это не самый лучший вариант. Если вы пошли по этому маршруту, вам нужно будет прислушаться к моему предупреждению внизу этого сообщения.
- Это подводит нас к моей последней идее. У Square была аналогичная проблема, когда они нуждались в доступе к ActionBar Activity в своих подзаголовках/презентаторах. Они открыли доступ к ActionBar в своем примере приложения через то, что они назвали ActionBarOwner.java. Затем они реализуют интерфейс ActionBarOwner и дают экземпляр самого себя в DemoActivity.java. Если вы изучите, как они реализовали это и поделиться им с помощью инъекции, вы можете создать аналогичный класс. AcivityLifecycleOwner или что-то (имя нуждается в работе), и вы можете подписаться на обратные вызовы от него. Если вы решите пойти по этому маршруту и не будете осторожны, вы можете легко потерять память. Каждый раз, когда вы подписываетесь на какие-либо события (я бы рекомендовал вам подписаться в презентаторе), вам нужно будет также отказаться от подписки в методе onDestroy. Я создал короткий непроверенный образец того, что я имею в виду для этого решения ниже.
Независимо от того, какой подход вы используете, вам, вероятно, нужно будет убедиться, что ваши методы onCreate и onDestroy на самом деле поступают от вашего ведущего, а не точные события из активности. Если вы используете только sdk на одном представлении, функция onCreate этого действия вызывается задолго до того, как будет создан экземпляр вашего представления, и onDestroy для Activity будет вызван после того, как ваше представление будет уничтожено. Я думаю, что презентация onLoad и onDestroy достаточно, но я не тестировал это.
Удачи!
Непроверено пример кода для решения # 3:
Все ваши ведущие могли бы расширить этот класс вместо ViewPresenter и затем переопределить каждый метод, который вы хотели события для так же, как вы бы в деятельности:
public abstract class ActivityLifecycleViewPresenter<V extends View> extends ViewPresenter<V>
implements ActivityLifecycleListener {
@Inject ActivityLifecycleOwner mActivityLifecycleOwner;
@Override protected void onLoad(Bundle savedInstanceState) {
super.onLoad(savedInstanceState);
mActivityLifecycleOwner.register(this);
}
@Override protected void onDestroy() {
super.onDestroy();
mActivityLifecycleOwner.unregister(this);
}
@Override public void onActivityResume() {
}
@Override public void onActivityPause() {
}
@Override public void onActivityStart() {
}
@Override public void onActivityStop() {
}
}
Активность Владелец жизненного цикла, который будет введен в действие, а затем подключен к соответствующим событиям. Я намеренно не включал onCreate и onDestroy, так как вы, ведущий, не смогли бы получить доступ к этим событиям, поскольку они не будут созданы или они уже будут уничтожены. Вместо них вам нужно будет использовать презентаторов onLoad и onDestroy. Также возможно, что некоторые из этих других событий не будут вызваны.
public class ActivityLifecycleOwner implements ActivityLifecycleListener {
private List<ActivityLifecycleListener> mRegisteredListeners
= new ArrayList<ActivityLifecycleListener>();
public void register(ActivityLifecycleListener listener) {
mRegisteredListeners.add(listener);
}
public void unregister(ActivityLifecycleListener listener) {
mRegisteredListeners.remove(listener);
}
@Override public void onActivityResume() {
for (ActivityLifecycleListener c : mRegisteredListeners) {
c.onActivityResume();
}
}
@Override public void onActivityPause() {
for (ActivityLifecycleListener c : mRegisteredListeners) {
c.onActivityPause();
}
}
@Override public void onActivityStart() {
for (ActivityLifecycleListener c : mRegisteredListeners) {
c.onActivityStart();
}
}
@Override public void onActivityStop() {
for (ActivityLifecycleListener c : mRegisteredListeners) {
c.onActivityStop();
}
}
}
Теперь вам нужно подключить владелец к жизненному циклу деятельности:
public class ActivityLifecycleExample extends MortarActivity {
@Inject ActivityLifecycleOwner mActivityLifecycleOwner;
@Override protected void onResume() {
super.onResume();
mActivityLifecycleOwner.onActivityResume();
}
@Override protected void onPause() {
super.onPause();
mActivityLifecycleOwner.onActivityPause();
}
@Override protected void onStart() {
super.onStart();
mActivityLifecycleOwner.onActivityStart();
}
@Override protected void onStop() {
super.onStart();
mActivityLifecycleOwner.onActivityStop();
}
}
Over in https://github.com/square/mortar/issues/97#issuecomment-50798195 мы обсудили, как было бы хорошей идеей для PauseAndResumePresenter вызывать метод onPause регистратора, если активация выполняется, когда их область действия заканчивается. Я еще не обновил код для этого. – rjrjr