onActivityResult调用得太早了

时间:2012-11-30 17:31:09

标签: android android-intent timing

我有同步问题。我搜索过,找不到与我相同条件的问题。欢迎指点。

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()方法,就像最佳实践所说的那样,但我不知道如何解决时间问题。有什么建议?我做了一件明显不对的事吗?

4 个答案:

答案 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