2015-10-04 4 views
2

Активность, назовем это MainActivity, есть класс, на который он полагается, назовем его LogicClass. Этот класс имеет состояние - и это состояние должно быть сохранено.Dagger 2 & Serialization

Чтобы уточнить, общий поток будет выглядеть примерно так.

  • MainActivity только что создано.
  • LogicClass создано с по умолчанию состояние.
  • Выполнены некоторые действия и изменения состояния LogicClass.
  • MainActivity остановлен/уничтожен и таким образом LogicClass.
  • MainActivity воссоздан
  • LogicClass создается с изменилось состояние.

Перед использованием инъекции зависимостей, что раньше произойдет была LogicClass реализована Serializable и MainActivity создали LogicClass экземпляр. MainActivity был ответственен за его сериализацию, когда действие прекратилось и десериализовало его при создании этой активности.

До:

public class MainActivity extends AppCompatActivity { 

    private LogicClass mLogicClass; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // .. 

     mLogicClass = deserializeLogic(); 
     if (mLogicClass == null) { 
      mLogicClass = new LogicClass(); 
     } 
    } 

    @Override 
    protected void onStop() { 
     // .. 

     serializeLogic() 
    } 
} 

Сейчас я использую Dagger2 для DI, так что все выглядит следующим образом:

public class MainActivity extends AppCompatActivity { 

    @Inject LogicClass mLogicClass; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // .. 

     injectDependencies(); 

    } 
} 

Что такое правильный подход для сериализации с помощью Dagger 2?

Первых вещей, которые пришли на ум, чтобы LogicClass возможности сериализации и десериализации своего состояния с помощью утилиты сериализации, создавая load() и save() методы, бывших когда их называют конструктором, а последней называют снаружи - в мой случай, на MainActivity в методе onStop(). Мысли?

ответ

0

Вы можете переместить код десериализации в @Module, который создает LogicClass, предполагая, что он у вас есть, или создать его для него. Проблема в том, что компоненты Dagger 2 не выполняют никакой очистки, когда они уходят, вам все равно придется иметь код сериализации, инициированный MainActivity.

В качестве альтернативы вы можете запустить код десериализации после создания состояния по умолчанию, переопределяя поле mLogicClass, если он может найти свою сериализованную форму.

Если LogicClass слишком дорого для создания дважды (один раз для состояния по умолчанию, которое просто отбрасывается при замене десериализованным экземпляром), вам необходимо прекратить впрыскивать это поле и просто запросить его у компонента, например. путем добавления метода LogicClass logicClass() к компоненту. Таким образом, вы все равно можете создать состояние по умолчанию, только если десериализация не находит сериализованную форму.