2012-11-30 196 views
2

我有一個同步問題。我已經搜索並找不到與我的條件相同的問題。指針是受歡迎的。onActivityResult調用太早

Eclipse 4.1.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()方法。我把記錄呼叫整個顯示內容發生如下:

1)用戶在DetailActivity並改變一些數據的髒標誌設置爲true。
2)用戶點擊系統返回按鈕。
3)DetailActivity從屏幕上消失。
4)ListActivity重新出現。
5)Log注意到ListActivity的onActivityResult(),onRestart(),onStart()和onResume()方法按此順序執行
6)記錄其他一些內容。
7)Log FINALLY注意到DetailActiviy的onStop()方法執行。

這意味着,到時候我正在更新數據庫,並建立結果的意圖,調用活動已經通過了使用它的點。

我寧願不經常更新數據庫。我寧願把它放到像最佳實踐所說的onStop()方法中,但我不知道如何解決時間問題。有什麼建議麼?我做了什麼明顯錯誤?

回答

1

我寧願依賴於基於事件的代碼邏輯而不是概率。你可以嘗試以下。

* 1)用戶處於DetailActivity中,並將某些數據設置爲dirty標誌爲true。 2)用戶點擊系統後退按鈕。 *

覆蓋onBackPressed方法並在那裏執行數據庫操作,一旦DB操作執行完畢,您可以調用super.onBackPressed()方法並讓Android Activity堆棧接管。 請注意,DB操作可能非常耗時,因此建議使用帶回調的AsyncTask,然後才能調用finish()。

+0

PravinCG, 這正是我一直在尋找的答案。這讓我可以在系統知道用戶想要關閉此活動之前完成數據庫工作。作爲一個好處,它只發生在用戶點擊後退按鈕而不是當活動停止時。這意味着,如果用戶改變方向或打電話並且活動停止甚至銷燬,則可以通過正常方式管理狀態,但只有在用戶明確解除活動時纔會將更改提交到數據庫。 - 續 – Dogulas

+0

Continued- \t @Override 公共無效onBackPressed(){ \t Log.d( 「DetailActivity.onBackPressed()」, 「檢查點」); (_currentDataIsDirty){ \t \t DoDatabaseWork(_currentData); \t} \t _resultIntent = new Intent(); \t _resultIntent.putExtra(ListActivity .DETAIL_RESULT,_currentData); \t setResult(Activity.RESULT_OK,_resultIntent); \t super.onBackPressed(); } 我打算保持這種模式,當孩子需要做重任務時,從孩子活動回到父母活動。再次感謝。 – Dogulas

+0

@Dogulas:很高興這有助於。與使用stackoverflow的情況一樣,你應該接受這個答案。 – PravinCG

0

這是因爲onPause()被稱爲之後的活動失去焦點。該onStop()在活動將要destroyd(通常當沒有足夠的內存),但是被調用。所以,把你的代碼到onPause()方法,你應該罰款...

+0

托馬斯 感謝您的答覆。是的,我曾想過把清理東西在的onPause(),但文檔不鼓勵它: http://developer.android.com/training/basics/activity-lifecycle/stopping.html 「雖然在onStop()之前調用onPause()方法時,應該使用onStop()執行更大的CPU密集型關閉操作,例如將信息寫入數據庫。 - 繼續 – Dogulas

+0

- 繼續 這就是爲什麼我使用onStop()。我也考慮過onDestroy(),但我敢打賭我目前的問題會更糟。另外,onPause()比onStop()更頻繁地出現(確定,也許只是更頻繁一點點)。當活動部分模糊時,它將被調用。我真的不希望比我必須更頻繁地完成所有數據庫工作。 所有這一切,你的解決方案將工作。 Dogulas – Dogulas

+0

@Dogulas你是對的。 'onPause()'應該只包含快速代碼,這樣用戶不必等待響應時間過長。另一方面,這是唯一可以肯定的方法。所以這不是一個簡單的選擇:) – user219882

3

檢查你做你的活動作爲一個SingleInstance如果是,那麼它做出SingleTop

+0

阿里伊姆蘭, 謝謝你的迴應。我只是讓嚮導創建活動和清單文件,默認情況下不包含啓動模式。這意味着它默認爲「標準」。這在我看來似乎不是問題。該解決方案似乎是PravinCG提出的解決方案。再次感謝你的回覆。 Dogulas – Dogulas

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