2

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

Eclipse 4.2.1 上的 Android 4.1.2

我有两个活动;我们称它们为 ListActivity 和 DetailActivity。在 ListActivity 上按下按钮,我启动 DetailActivity。当用户对 DetailActivity 中的数据进行更改然后单击后退按钮时,我想做两件事。首先,如果脏标志为真,我想保存对数据库的更改。其次,我想返回一个 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) 日志最后注意到 DetailActiviy 的 onStop() 方法执行。

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

我宁愿不经常更新数据库。我宁愿像最佳实践所说的那样将它放入 onStop() 方法中,但我不知道如何解决时间问题。有什么建议么?我在做一些明显错误的事情吗?

4

4 回答 4

3

检查您是否将您的活动设置为“SingleInstance如果是”,然后进行SingleTop

于 2012-11-30T17:39:36.230 回答
1

我宁愿依赖基于事件的代码逻辑而不是概率。您可以尝试以下方法。

* 1) 用户在 DetailActivity 中并更改了一些数据,将脏标志设置为 true。2) 用户点击系统返回按钮。*

覆盖 onBackPressed 方法并在此处执行数据库操作,一旦执行 DB 操作,您可以调用 super.onBackPressed() 方法并让 Android Activity 堆栈接管。请注意,数据库操作可能很耗时,因此还建议使用带有回调的 AsyncTask,然后才调用 finish()。

于 2012-11-30T17:50:09.427 回答
0

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

于 2012-11-30T17:39:21.337 回答
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();
}

多古拉斯

于 2012-11-30T20:51:20.753 回答