我有两项活动,比如说ActivityA
和ActivityB
,顺序为:
ActivityA - > ActivityB
现在两个活动都将读取和写入相同的数据库,当ActivityB
目的地,我将最后一个状态保存到数据库,然后当用户返回ActivityA
时,我将重新加载状态形成数据库。
但是我发现read
中的ActivityA
操作始终在write
中的ActivityB
操作之前完成:
class ActivityB{
@Override
protected void onDestroy() {
....
mDao.update(mItem);
System.out.println("pro:save:" + mItem.name + ":" + mItem.progress);
// mDatabase.close();
super.onDestroy();
}
}
class ActivityA{
@Override
protected void onResume() {
super.onResume();
mLocalDbLoadTask = new LocalDbLoadTask();
mLocalDbLoadTask.execute(mItem);
}
class LocalDbLoadTask extends AsyncTask<Item, Void, Item> {
@Override
protected Item doInBackground(Item... Items) {
Item item = Items[0];
mItemDao.fill(item);
return null;
}
@Override
protected void onPostExecute(Item Item) {
System.out.println("pro:load:" + mItem.name + ":" + mItem.progress);
}
}
}
我总是得到:
08-19 03:04:45.730 4757-4757/com.kk I/System.out﹕ pro:load:name xx:11
08-19 03:04:46.094 4757-4757/com.kk I/System.out﹕ pro:save:name xx:14
这意味着如果项目在ActivityA
更新,则ActivityB
无法获取项目的最新状态(示例中为14)。
问题是什么?
更新
将代码保存从onDestory
移至onPause
后,订单是正确的,但有时我仍然得到错误的值:
08-19 03:30:00.170 5330-5330/com.kk I/System.out﹕ pro:save:xx:16
08-19 03:30:00.214 5330-5330/com.kk I/System.out﹕ pro:load:xxx:null
如图所示16
已保存在ActivityB
中,null
已保存在ActivityA
中。
答案 0 :(得分:1)
我认为,问题是活动生命周期。
onPause()在系统即将开始恢复上一个活动时调用。
onStop()当活动不再对用户可见时调用,因为另一个活动已经恢复并且正在覆盖此活动。
onDestroy()在您的活动被销毁之前收到的最终通话。
一般情况下,订单应为ActivityB.onPause()
- &gt; ActivityA.onResume()
- &gt; ActivityB.onStop()
- &gt; ActivityB.onDestroy()
。您可以通过onResume()
,onPause()
和onDestroy()
方法拨打日志来进行检查。
因此,只需在ActivityB的onPause()
方法中写入对数据库的更改。