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)

  • Problemas para mantener vivo el mensaje de Google Cloud
  • Android HttpURLConnection PUT a Amazon AWS S3 403 error
  • Pregunta de la sintaxis del principiante de Android / java
  • Significado de android @override
  • Android y Javadoc: @inheritDoc no funciona
  • Android.view.InflateException: Línea de archivo XML binario # 33: Error al inflar fragmento de clase
  • ¿Cómo puedo importar una biblioteca de Android y usarla tanto en el código de producción como en las pruebas?
  • Cómo enviar json de android a php?
  • Utilizando gps en un mapa estático en android?
  • Cómo utilizar la conexión SQLite desde la carpeta de activos
  • Android - ViewRootImpl $ CalledFromWrongThreadException
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.