2015-10-04 61 views
2

我的活动,可以叫它MainActivity,有一个它依赖的类,我们称之为LogicClass。这个班级有一个州 - 那个州应该是持续Dagger 2&Serialization

为了澄清,一般流程看起来像这样。

  • MainActivity是新创建的。
  • LogicClass是使用默认状态创建的。
  • 执行了一些操作,并且LogicClass的状态发生了变化。
  • MainActivity已停止/销毁,因此LogicClass也是如此。
  • MainActivity被重建
  • LogicClass创建与改变状态。

使用依赖注入,什么曾经发生是LogicClass实施SerializableMainActivity创造了一个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(); 

    } 
} 

什么是使用匕首2序列正确的做法?

浮现在脑海的第一件事情是让LogicClass能够序列,并通过序列化程序反序列化的状态,创造load()save()方法,前者是通过构造函数调用,而后者从外面被称为 - 中我的情况,MainActivityonStop()方法。思考?

回答

0

您可以将反序列化代码移动到创建LogicClass@Module,假设您有一个,或者为其创建一个。问题在于Dagger 2组件在它们消失时不会进行任何清理,您仍然必须使用由MainActivity触发的序列化代码。

或者,您可以在创建默认状态后运行反序列化代码,如果可以找到其序列化形式,则覆盖mLogicClass字段。

如果LogicClass创建两次的代价太高(对于默认状态,一旦被反序列化实例替换时被简单地丢弃,则一次),那么您将需要停止注入该字段,并且只需从该组件请求该字段。通过向组件添加LogicClass logicClass()方法。这样,只有在反序列化没有找到序列化表单的情况下,您仍然可以创建默认状态。