2015-05-19 33 views
12

我对使用MVP在Android上保存状态存在一些疑问。我将我的片段/活动定义为视图,然后实施相应的演示者。MVP Android - 在哪里保存视图状态?

我的例子很简单:

我有一些复选框和纺纱一个活动。如果该活动被Android系统销毁并重新创建,我应该在哪里保存这些spinners和复选框状态?在视图上?在主持人?

如果在视图上,我应该在视图还是演示者上具有还原逻辑?

谢谢!

回答

2

在MVP的情况下,模型负责保持视图的状态。

例如,在你模型中,你有一个实体与数组类别。 在您的视图中,每个类别都有一个复选框,并且在每个选中/未选中的操作中,您可以从帖子的类别数组中添加/删除对象。

一旦恢复活动,在查看应以找出索要邮政类别阵列被选中的,哪些不是,所以它可以设置适当的选中/取消选中属性。

这里是一个非常好的职位看:http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/

+0

我明白,但我的例子是一种创造形式。所以我的模型可能是一个带有类别的帖子。问题是我从不保存后期对象。目标是创建一个后期对象并使用它来发出Web请求。所以,我想我做这件事的唯一方法是存储在视图中,然后重新创建视图的状态。我错了吗? @mmark –

+1

@FábioCarballo如果我没有误解MVP的目标,你将不需要保存Post对象(通过“保存”我假设你的意思是像本地数据库或SharedPreferences之类的东西)。主持人+模型是应该在视图状态变化中坚持(在内存中)的人 – mmark

0

演示者是模型和视图之间的接口,不应该采取任何节能状态的任何责任。让Model或View处理状态更有意义:

  1. Model。 Presenter负责在活动初始​​化期间填充View with Model数据并提交全部立即查看与模型的交互。模型始终保持最新,因此配置更改无关紧要。
  2. 查看。 Presenter负责在初始化期间填充View with Model数据,但View会保存并恢复配置更改时自己的状态。这在创建/编辑情况下是有意义的,其中“保存”按钮存在,并且您有一个瞬态模型(或工作模型)。

当'Save'按钮存在时,后一种方法是有意义的。演示者不涉及任何方式。

0

1.保存&在视图中恢复视图状态(活动/片段)。

我宁愿节省&在视图本身(活动/片段)恢复视图的状态

因此,它的观点负责保存其状态(因此坚持单一职责原则)。

/** 
* On Save Instance State. 
* 
* @param outState Out State. 
*/ 
@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString(STATE_KEY_USERNAME, getUserNameFieldValue()); 
    outState.putString(STATE_KEY_PASSWORD, getPasswordFieldValue()); 
    outState.putBoolean(STATE_KEY_REMEMBER_ME, getRememberMeFieldValue()); 
} 

/** 
* On Restore Instance State. 
* 
* @param savedInstanceState Saved Instance State. 
*/ 
@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    if (savedInstanceState != null) { 
     String userName = savedInstanceState.getString(STATE_KEY_USERNAME, ""); 
     String password = savedInstanceState.getString(STATE_KEY_PASSWORD, ""); 
     boolean rememberMe = savedInstanceState.getBoolean(STATE_KEY_REMEMBER_ME, false); 

     userNameEditText.setText(userName); 
     passwordEditText.setText(password); 
     rememberMeCheckBox.setChecked(rememberMe); 
    } 
} 

2.保存&恢复演示状态演示

如果您需要保存演示中的任何状态,那么做演示者。

我的基地主持人看起来这

/** 
* On Create View. 
* <p> 
* 1. Gets called from view's onCreate method. 
* 
* @param view   View. 
* @param savedInstanceState Saved Instance State. 
*/ 
void onCreateView(final View view, final Bundle savedInstanceState); 

/** 
* On Attach View. 
* <p> 
* 1. Gets called from view's onStart method. 
*/ 
void onAttachView(); 

/** 
* On Detach View. 
* <p> 
* 1. Gets called from view's onStop method. 
*/ 
void onDetachView(); 

/** 
* On Save State. 
* <p> 
* 1. Gets called before view is destroyed to save the state of the presenter. 
* 
* @param outState Bundle in which to place your saved state. 
*/ 
void onSaveState(final Bundle outState); 

/** 
* On Destroy View. 
* <p> 
* 1. Gets called from view's onDestroy method. 
*/ 
void onDestroyView();