我有同步问题。我搜索过,找不到与我相同条件的问题。欢迎指点。
Eclipse 4.2.1上的Android 4.1.2
我有两项活动;让我们称它们为ListActivity和DetailActivity。按下ListActivity上的按钮,我启动DetailActivity。当用户更改DetailActivity中的数据然后单击后退按钮时,我想做两件事。首先,如果脏标志为true,我想保存对数据库的更改。其次,我想将一个Intent返回给ListActivity的onActivityResult()方法。
问题在于时机问题。由于我想进行数据库更新,因此我认为最佳做法是在DetailActivity的onStop()方法中执行此操作。在我更新数据库之后,我设置了Intent并在DetailActivity中调用了setReult()方法。
_resultIntent = new Intent();
_resultIntent.putExtra(ListActivity .DETAIL_RESULT, _currentData);
Log.d("ListActivity.setUpReturn()", "checkpoint");
setResult(Activity.RESULT_OK, _resultIntent);
在我有机会设置结果之前,会调用ListActivity的onActivityResult()方法。我在整个过程中放置了Log调用,看起来似乎发生了以下情况:
1)用户在DetailActivity中并更改一些数据,将脏标志设置为true
2)用户单击系统返回按钮
3)DetailActivity从屏幕上消失
4)ListActivity重新出现
5)日志注意到ListActivity的onActivityResult(),onRestart(),onStart()和onResume()方法按顺序执行
6)记录其他一些东西
7)Log FINALLY注意到DetailActiviy的onStop()方法执行。
这意味着当我更新数据库并设置结果Intent时,调用活动已经超过了使用它的时间。
我宁愿不经常更新数据库。我宁愿将其放入onStop()方法,就像最佳实践所说的那样,但我不知道如何解决时间问题。有什么建议?我做了一件明显不对的事吗?
答案 0 :(得分:3)
如果是,请检查您是否将活动视为SingleInstance
,然后转到SingleTop
答案 1 :(得分:1)
我宁愿依赖基于事件的代码逻辑而不是概率。您可以尝试以下方法。
* 1)用户在DetailActivity中并更改一些数据,将脏标志设置为true。 2)用户单击系统返回按钮。 *
覆盖onBackPressed方法并在那里执行数据库操作,一旦执行了DB操作,就可以调用super.onBackPressed()方法并让Android Activity堆接管。 请注意,数据库操作可能非常耗时,因此建议将AsyncTask与回调一起使用,然后再调用finish()。
答案 2 :(得分:0)
这是因为在活动失去焦点后立即调用onPause()
。然而,当活动将要销毁时(通常在没有足够的内存时)调用onStop()
。所以把你的代码放到onPause()
方法中,你应该没事......
答案 3 :(得分:0)
事实证明,对我来说最好的解决方案来自PravinCG。我将在未来将其用作模式。
@Override
public void onBackPressed() {
Log.d("DetailActivity.onBackPressed()", "checkpoint");
if (_currentDataIsDirty) {
DoDatabaseWork(_currentData);
}
_resultIntent = new Intent();
_resultIntent.putExtra(ListActivity .DETAIL_RESULT, _currentData);
setResult(Activity.RESULT_OK, _resultIntent);
super.onBackPressed();
}
Dogulas