onActivityResult调用太早



我有一个同步性问题。我已经搜索过了,找不到与我条件相同的问题。欢迎指点。

Eclipse 4.2.1 上的Android 4.1.2

我有两项活动;让我们称之为ListActivity和DetailActivity。在ListActivity上按下一个按钮,我启动DetailActivity。当用户更改DetailActivity中的数据,然后单击后退按钮时,我想做两件事。首先,如果脏标志为true,我想保存对数据库的更改。其次,我想向ListActivity的onActivityResult()方法返回一个Intent。

问题出在时间上。由于我想进行数据库更新,我读到在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()方法在我有机会设置结果之前被调用。我在整个过程中都打了日志电话,似乎发生了以下情况:

1) 用户在DetailActivity中并更改一些数据,将脏标志设置为true
2)用户单击系统后退按钮
3)DetailActivity从屏幕上消失
4)ListActivity重新出现
5)日志记录了ListActivity的onActivityResult()、onRestart()、onStart()和onResume()方法按此顺序执行
6)记录了一些其他内容
7)Log FINALLY注意到DetailActivity的onStop()方法执行。

这意味着,当我更新数据库并设置结果Intent时,调用活动已经超过了使用它的时间点

我宁愿不经常更新数据库。我宁愿像最佳实践所说的那样把它放在onStop()方法中,但我不知道如何绕过时间问题。有什么建议吗?我是不是做错了什么?

检查您是否将活动设置为SingleInstance如果是,则将其设置为SingleTop

我宁愿依赖基于事件的代码逻辑,也不愿依赖概率。您可以尝试以下操作。

*1)用户在DetailActivity中更改一些数据,将脏标志设置为true。2) 用户单击系统后退按钮*

重写onBackPressed方法并在那里执行数据库操作,一旦执行了DB操作,您就可以调用super.onBackPressed()方法,让Android活动堆栈接管它。请注意,DB操作可能很耗时,因此还建议将AsyncTask与回调一起使用,然后再调用finish()。

这是因为onPause()是在活动失去焦点后立即调用的。然而,当活动将被销毁时(通常是在内存不足时)会调用onStop()。因此,将您的代码放入onPause()方法中,您应该可以。。。

事实证明,对我来说最好的解决方案来自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();
}

多古拉斯

最新更新