当前位置: 首页 > 工具软件 > Standup Timer > 使用案例 >

standupTimer项目中的状态恢复与保存

邓卓
2023-12-01
standupTimer项目中的与会者人数、会议时长还有与会小组名称,在初始化的时候都会初始化为一个默认值,当用户对其进行设置并启动以后,standupTimer项目会将用户的设置保存起来,以便下次启动的时候恢复,用户输入数据的恢复和保存动作都是通过Android持久化存储方式中的SharedPreferences进行的。

对用户数据进行加载的函数为:

protected void loadState() {
	SharedPreferences preferences = getPreferences(MODE_PRIVATE);
	meetingLength = preferences.getInt(MEETING_LENGTH, 5);
	numParticipants = preferences.getInt(NUMBER_OF_PARTICIPANTS, 2);
	teamNamesPos = preferences.getInt(TEAM_NAMES_POS, 0);
}
对用户数据进行保存的函数为:
private void saveState() {
	SharedPreferences.Editor preferences = getPreferences(MODE_PRIVATE).edit();
	preferences.putInt(MEETING_LENGTH, meetingLength);
	preferences.putInt(NUMBER_OF_PARTICIPANTS, numParticipants);
	preferences.putInt(TEAM_NAMES_POS, teamNamesPos);
	preferences.commit();
}

对用户数据进行保存和加载完成后,在业务流程中就可以对数据进行操作,standupTimer项目在初始化UI的时候对数据进行加载,在通过button按钮触发会议计时以后对用户界面数据进行保存。这里似乎有一个bug,就是用户设置好数据以后,并没有触发会议计时而是切换到其他App应用,当Android内存不足的时候系统将standupTimer项目清理掉,此时用户设置的数据就没有得到保存,所以我觉得应该在onPause()函数中对数据进行保存在,这样当standupTimer项目项目切换到后台或者被意外销毁,都会对用户设置的数据进行了保存。为了不影响项目原有的逻辑,可以增加updateState()方法,对成员变量进行更新,然后在onPause()方法中对updateState()方法方法进行调用;

protected void onPause() {
	updateState();
	saveState();
	super.onPause();
}

private void updateState(){
	meetingLength = getMeetingLengthFromUI();

	TextView t = (TextView) findViewById(R.id.num_participants);
	numParticipants = parseNumberOfParticipants(t);

	Spinner teamNameSpinner = (Spinner) findViewById(R.id.team_names);
	teamNamesPos = teamNameSpinner.getSelectedItemPosition();
}
附源码中一个小小的bug:

standupTimer项目在对UI进行初始化的时候,有如下方法:

private void initializeNumberOfParticipants() {
	TextView t = (TextView) findViewById(R.id.num_participants);
	t.setText(Integer.toString(numParticipants));
}
其中num_participants资源是EditView类型,源码使用TextView进行强转,虽然两者都是View类型对象,强转不会出现什么问题,但是还是最好不要这么做。另外对EditView进行初始化时候,最好将光标位置设置到文本末尾,这样更方便用户输入。以上方法修改如下:
private void initializeNumberOfParticipants() {
	EditText t = (EditText) findViewById(R.id.num_participants);
	t.setText(Integer.toString(numParticipants));
	t.setSelection(Integer.toString(numParticipants).length());
}

 类似资料: