2014-09-26 2 views
1

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

Я пытаюсь использовать Roboguice и Robospice. Я вставляю Robosice 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 наблюдать фрагмент события рядом активность событий, документация не ясно?

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

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

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

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

ответ

1

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

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

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

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

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

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

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

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

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

Я не понял.

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