2016-08-04 42 views
6

Zakładając, co zostało powiedziane, here, deweloper jest odpowiedzialny za utrzymanie instancji składnika w celu implementacji własnej logiki zasięgu (ponieważ metoda o określonym zakresie zwróci tę samą instancję dla danego komponentu).Obsługa elementu sztyletu przy zmianie orientacji

Jaki jest czysty sposób na zachowanie odniesienia do tego komponentu podczas cyklu życia aktywności?

Przykład: Wdrażasz wzorzec MVP, więc potrzebujesz prezentera w swojej Działalności. Ten Presenter może wykonać operację sieciową, aby pobrać elementy. Kiedy urządzenie się obraca, twoja Aktywność jest niszczona i odtwarzana, ale chcesz utrzymać działanie sieci i po prostu odzyskać prezentację przed rotacją.

Ustalanie zakresu komponentu dostarczającego prezenterowi niestandardowego zakresu PerActivity jest rozwiązaniem, więc należy zachować instancję składnika przez ten obrót, aby uzyskać wstrzyknięcie tego samego wystąpienia prezentera, co pierwsze uruchomienie działania.

Jak możemy sobie z tym poradzić? Myślałem o rodzaju pamięci podręcznej komponentów (takiej jak HashMap?), Która mogłaby być zapewniona przez komponent aplikacji żyjący w klasie Application.

+2

Dostępne opcje: - pamięć podręczna komponentów w aplikacji; - niestandardowa instancja inna niż konfiguracja; - zachowany fragment. – EpicPandaForce

+0

** Osobiście ** Właśnie blokuję wysyłkę zdarzeń przez magistralę zdarzeń, podczas gdy bieżąca aktywność nie jest 'wznawiana'd, i umieszczam stan prezentera w pakiecie, a następnie przywracam jego stan przed wznowieniem zdarzeń. A zatem moi prezenterów nie mają dostępu. – EpicPandaForce

+0

Jak zapisać stan prezentera w pakiecie, jeśli ten stan, na przykład, gdy klient OkHttp pobiera dane? W tym przypadku wydaje się, że pamięć podręczna prezentera jest wymagana. –

Odpowiedz

0

Możesz zobaczyć implementację aplikacji pokazowej ribot/android-boilerplate. Rozwiązaniem, które wybiorą jest static Map<Long, ConfigPersistentComponent> wewnątrz BaseActivity, z której wszystkie działania obejmują.

public class BaseActivity extends AppCompatActivity { 

    private static final AtomicLong NEXT_ID = new AtomicLong(0); 
    private static final Map<Long, ConfigPersistentComponent> sComponentsMap = new HashMap<>(); 

    private ActivityComponent mActivityComponent; 
    private long mActivityId; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Create the ActivityComponent and reuses cached ConfigPersistentComponent if this is 
     // being called after a configuration change. 
     mActivityId = savedInstanceState != null ? 
       savedInstanceState.getLong(KEY_ACTIVITY_ID) : NEXT_ID.getAndIncrement(); 

     ConfigPersistentComponent configPersistentComponent; 
     if (!sComponentsMap.containsKey(mActivityId)) { 
      // Creating new component 
      configPersistentComponent = DaggerConfigPersistentComponent.builder() 
        .applicationComponent(BoilerplateApplication.get(this).getComponent()) 
        .build(); 
      sComponentsMap.put(mActivityId, configPersistentComponent); 
     } else { 
      // Reusing component 
      configPersistentComponent = sComponentsMap.get(mActivityId); 
     } 
     mActivityComponent = configPersistentComponent.activityComponent(new ActivityModule(this)); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putLong(KEY_ACTIVITY_ID, mActivityId); 
    } 

    @Override 
    protected void onDestroy() { 
     if (!isChangingConfigurations()) { 
      // Activity is finishing, removing the component 
      sComponentsMap.remove(mActivityId); 
     } 
     super.onDestroy(); 
    } 

    ... 

} 
0

Sieć może pracować z kontekstem aplikacji. ten sposób chciałbym zaprojektować Applicationcomponent z appscope Teraz bym to tworzone na warstwie aplikacji ApplicationComponent Shouod wziąć kontekst jako zewnętrznego uzależnienia

Następny jest activitycomponent rozszerzenie na activitymodule z peractivityscope ..depending na applicationcomponet

W każdej mojej działalności utworzę activityComponet, udostępniając go applicationcomponet Do tego pakietu aplikacji można uzyskać dostęp przez. Activity.getapplication(). Getapplicationcomponent()

Tutaj upewnij się, że Twój applicationmodule zapewniający metodę sieci ma appplope Jeśli tak jest, to powinieneś dostać tę samą sieć nawet w przypadku rorate aplikacji.

Poszukaj próbki GitHubapplication po opublikowaniu linku w następnej edycji.

Warto również zajrzeć do trybu liveata (z kontekstu na to pytanie)