2015-10-24 4 views
2

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

Он работает нормально, но поскольку его жизненный цикл привязан к активности, а не фрагментам, я реализовал то же самое в этом фрагменте.

public class MainActivityFragment extends Fragment { 
private SpiceManager spiceManager = new SpiceManager(JacksonSpringAndroidSpiceService.class); 
private static final String KEY_LAST_REQUEST_CACHE_KEY = "lastRequestCacheKey"; 
private String lastRequestCacheKey; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
     performRequest(mSort); 
     return rootView; 
    } 
    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     if (!TextUtils.isEmpty(lastRequestCacheKey)) { 
      outState.putString(KEY_LAST_REQUEST_CACHE_KEY, lastRequestCacheKey); 
     } 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     if (savedInstanceState != null && savedInstanceState.containsKey(KEY_LAST_REQUEST_CACHE_KEY)) { 
      lastRequestCacheKey = savedInstanceState.getString(KEY_LAST_REQUEST_CACHE_KEY); 
      spiceManager.addListenerIfPending(MovieDataResult.class, lastRequestCacheKey, 
        new ListMovieRequestDataListener(movieImageAdapter, getActivity(),progressDialog)); 
      spiceManager.getFromCache(MovieDataResult.class, lastRequestCacheKey, DurationInMillis.ONE_MINUTE, 
        new ListMovieRequestDataListener(movieImageAdapter, getActivity(),progressDialog)); 

     } 
     super.onActivityCreated(savedInstanceState); 
    } 
    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     spiceManager.start(getActivity()); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     if (spiceManager.isStarted()) { 
      spiceManager.shouldStop(); 
     } 
    } 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
     mSort = Utility.getPreferredSorting(getActivity()); 
     setUpProgressDialog(); 
    } 

    private void performRequest(String mSort) { 
     MovieDataRequest movieDataRequest = new MovieDataRequest(apiKey,mSort); 
     lastRequestCacheKey = movieDataRequest.createCacheKey(); 
     spiceManager.execute(movieDataRequest, lastRequestCacheKey, 
       DurationInMillis.ONE_MINUTE, new ListMovieRequestDataListener(movieImageAdapter, getActivity(),progressDialog)); 
    } 
} 

Это прекрасно работает, мне было интересно, если это следует за жизненным циклом. Как, я начинаю spicemanager onAttach() и останавливая onStop() и onRestoreInstance(), получая кешированные данные.

В принципе, это то, как он работает здесь ->

  • spicemanager начинается, когда фрагмент присоединен
  • затем .Execute() вызывается для запроса сети
  • spicemanager разрушается OnStop()

Кроме того, это хороший подход, чтобы иметь spicemanager для каждого вида деятельности?

ответ

1

Я также размышлял об этом вопросе недавно, когда создавал spiceManagers как в моих действиях, так и в классах фрагментов.

Это фактически приводит к тому, что у меня есть объекты spiceManager в нескольких местах и ​​для меня, я не думаю, что это был самый эффективный способ сделать что-то.

В конце концов, что я решил сделать, чтобы создать статический экземпляр spiceManager в моей деятельности:

public static SpiceManager spiceManager = new SpiceManager(SpiceService.class); 

Затем использовать этот статический spiceManager в моих фрагментов:

MainActivity.spiceManager.start(getActivity()); 

Я также думаю что самый эффективный способ сделать это, вероятно, если вы используете интерфейсы для передачи данных, которые вы хотите обработать robospice, чтобы вернуться к активности, и просто используйте spiceManager внутри вашей деятельности, чтобы выполнить всю работу. Однако это может быть основной частью работы.

+0

Создание статического spicemanager, а затем использование его в других действиях звучит великолепно, вам не придется создавать неуместные объекты. Но все же вам нужно создать различные POJO sepearte, SpiceRequest и Listeners для каждого вида деятельности, это зависит от ответа api. Я не получил вашу часть интерфейса, пожалуйста, уточните больше. – Ritesh

+0

Конечно, вам придется создавать разные POJO, SpiceRequest и Listeners, так как каждый сетевой вызов уникален в любом случае. Для интерфейсов я имею в виду, что они полезны для передачи данных между различными частями андроида, поскольку они используют шаблон наблюдателя для этого, например, от адаптера к активности или от фрагмента к активности. См. Этот вопрос и ответ, который я опубликовал об этом: http://stackoverflow.com/questions/33131836/interface-observer-pattern-null-object-reference – Simon

+0

Понял, это в основном создание интерфейса say infteraceA, который внедрен в Деятельность A, а затем тот же реализованный интерфейс может использоваться во всех других действиях. Это более структурировано с точки зрения обмена данными между действиями. Thankx simon. – Ritesh