Manejo del componente de la daga en el cambio de orientación

Suponiendo lo que se ha dicho aquí , es responsabilidad del desarrollador mantener la instancia de componente para implementar su propia lógica de ámbito (ya que un método de ámbito volverá a la misma instancia para un componente dado).

¿Cuál es la manera limpia de mantener esta referencia de componente a través del ciclo de vida de la actividad?

Ejemplo: está implementando el patrón MVP, por lo que necesita un presentador dentro de su actividad. Este presentador puede realizar una operación de red para descargar elementos. Cuando el dispositivo gira, su Actividad está siendo destruida y recreada, pero le gustaría mantener la operación de red en marcha y simplemente recuperar el presentador de pre-rotación.

Escanear el Componente que proporciona al Presentador un ámbito de PerActivity personalizado es la solución, por lo que debe mantener la instancia de Componente a través de esta rotación para obtener la misma instancia de Presenter que el primer lanzamiento de la Actividad.

¿Cómo podemos lidiar con esto? Pensé en un tipo de caché de componentes (como un HashMap?) Que podría ser proporcionado por un componente de aplicación que viven dentro de la clase de aplicación.

2 Solutions collect form web for “Manejo del componente de la daga en el cambio de orientación”

Puedes ver la implementación de ribot / android-boilerplate showcase app. La solución que eligieron es tener un static Map<Long, ConfigPersistentComponent> dentro de BaseActivity , del cual se extienden todas las actividades.

 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(); } ... } 

La red puede funcionar con el contexto de la aplicación. Así es como yo diseñaría Applicationcomponent con appscope Ahora tendría esto creado en la capa de aplicación ApplicationComponent Shouod toma contexto como dependencia externa

A continuación se muestra el componente de actividad que se extiende en el módulo de actividad con el peractivityscope ..dependiendo de applicationcomponet

En mi cada actividad crearía activityComponet proporcionándolo applicationcomponet Esta aplicacióncomponet se puede alcanzar vía. Activity.getapplication (). Getapplicationcomponent ()

Aquí asegúrese de que su método de aplicación de suministro de red tiene appscope Si ese es el caso u debe obtener la misma red, incluso en app rorate.

Busque GitHubapplication muestra publicará el enlace en la próxima edición.

También valdrá la pena mirar a livedata (fuera de contexto para esta pregunta)

  • Integración PayTm Payment Gateway Android
  • ¿Cómo hacer una pausa con DownloadManager?
  • ¿Cómo obtener datos de cada EditText creado dinámicamente en Android?
  • Cuando invoco una función Java desde mi código Javascript, WebView se bloquea. ¿Por qué?
  • Inicio de un complemento Phonegap después del reinicio del dispositivo
  • Buscar ruta con Androids API de Google Maps
  • La solicitud de servicio web no funciona en el navegador android android; Pero está trabajando en el navegador de PC
  • Envío de JSON en la solicitud POST con retrofit
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.