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

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

Я пытаюсь использовать как Roboguice, так и 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 — это просто пустой класс.


person Daniel Rusev    schedule 26.09.2014    source источник


Ответы (1)


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

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

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

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

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

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

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

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

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

Я не понял.

person Snicolas    schedule 01.11.2014