Какой контекст вводится roboguice?

Я хотел бы знать, какой контекст внедряет Roboguice, это контекст приложения или текущая активность?

Я пытаюсь использовать как Roboguice, так и Robospice. Я делаю инъекцию Robospice SpiceManager фрагмент, но фрагмент не знает о SpiceManager, он видит это через интерфейс, скажем, MyInterface,

public class MyFragment extends RoboFragment {
    //this is where the SpiceManager gets injected
    @Inject MyInterface manager;
    ...
}

//this is the implementation that I'm going to inject
//it is simultaneously an event listener for the fragment's life cycle events so that the
//SpiceManager can be appropriately started and stopped.
public class MyManager implements MyInterface {
    private SpiceManager spiceManager = new SpiceManager(MySpiceService.class);

    //Which context will get injected here? How can I make Roboguice inject a specific context that I want, for example, a specific activity that I want.
    private @Inject Context context;

    //Here, I need to start the SpiceManager
    public void myFragmentOnStart(@Observes OnStartEvent onStart) {
        //SpiceManager requires a context, more specifically an activity which will be destroyed and then garbage collected, so It shouldn't be an application context because the resources SpiceManager uses will never be released.
        spiceManager.start(context);
    }

    public void myFragmentOnStop(@Observes OnStopEvent onStop){
        if (spiceManager.isStarted()) {
            spiceManager.shouldStop();
        }
    }
}

Мои вопросы:

Может ли RoboGuice наблюдать события фрагмента помимо событий Activity, документация не ясна?

Правильно ли я считаю, что SpiceManager нужен контекст, который будет уничтожен при уничтожении фрагмента / действия? Я посмотрел на код SpiceManager.start(Context context) и это создает WeakReference к пройденному Context,

Как я могу заставить RoboGuice вводить определенный Context/Activity?

Можно ли сделать это без MyFragment зная, что MyInterface объект, который он использует, нуждается в Context?

Кстати, я узнал, что OnStopEvent имеет getActivity() метод, так что нет проблем с получением Activity в onStop, но OnStartEvent это просто пустой класс.

1 ответ

Так много вопросов;)

A) Может ли RoboGuice наблюдать за событиями фрагмента помимо событий Activity, документация не ясна?

Событие может быть чем угодно в РГ. По умолчанию RG предлагает несколько приятных событий для уведомления о жизненном цикле действия. Релиз 3.1 RG фактически добавляет некоторые новые события для фрагментов. Это должно быть выпущено через пару недель.

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

Единственное, что вам нужно, - это зарегистрироваться в этом экземпляре менеджера событий этого действия. добавлять @Inject EventManager eventManager к вашему фрагменту. Этого достаточно, чтобы RG автоматически зарегистрировал вашего слушателя.

Б) RS понадобится контекст только для обратных вызовов, а не для выполнения запроса. Запрос будет выполнен в сервисе. Контекст, который вы передаете RS, просто используется, чтобы сказать: "Если этот контекст умирает, то все слушатели умрут, не уведомляя их. Но все же, продолжайте, выполните запрос и кешируйте результат".

Здесь немного сложно, как ты это делаешь. На самом деле проще всего управлять менеджером специй на уровне активности. Отправляйте события из ваших фрагментов в вашу активность, чтобы попросить ее запускать запросы, когда это необходимо. Это самое простое.

Но также возможно управлять spice manager на уровне фрагментов. В этом случае управляйте жизненным циклом spice manager в самом фрагменте с помощью onStart/onStop методы.

C) Возможно ли это сделать без MyFragment, зная, что объект MyInterface, который он использует, нуждается в контексте?

Я не получил это.

Другие вопросы по тегам