不要保存到適配器靜態引用。它確實會泄漏記憶並且表現不好。
看來我誤解了第一次。下面是一個更新的答案:
首先解決
最漂亮的解決方案是實現對數據存儲的內容提供商和查詢的內容提供商在A與B兩者使用的ContentProvider更新B中的數據。插入() 和讀取使用contentProvider.query(),如果它是由數據庫或MatrixCursor支持,如果你只是將它保存在內存中的內容提供商返回例如SQLiteCursor數據。
的基本步驟(無CursorLoader):
- 在A的的onCreate你自己註冊爲在那裏URI是使用一些方案設置的URI使用
ContentResolver.registerContentObserver(uri, true, this)
一個contentobserver。
- 在onCreate of A中,您可以通過使用
ContentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
查詢contentprovider來獲取數據,其中projection,selection,selectionArgs和sortOrder可以是適合您的contentprovider(可能爲null)的內容。 Uri引用您想要查詢的數據並且是您的選擇。
- 當數據在裝載了B打電話
ContentResolver.insert()
。在您的ContentProvider的insert
你打電話ContentResolver.notifyChange (Uri uri, null, null)
其中URI是URI您在步驟1
- 用於實現一個的onChange(布爾selfChange),並重新查詢內容提供商時,它被調用。
請注意,如果您使用CursorLoaders,則根本不需要調用registerContentObserver! 它將在加載器中接收新的遊標,因爲它在通知更改時具有自動重新查詢。
第二溶液 一個不太漂亮的解決方案是實現處理該數據的單一對象。 喜歡的東西:
實現類
public class DataHolder {
private static DataHolder sDataHolder;
private String data = ""; // Data represented by string.
public DataHolder getInstance() {
if (sDataHolder == null) {
sDataHolder = new DataHolder()
}
return sDataHolder;
}
private DataHolder() {} // Hidden constructor
public void setData(final String data) {
mData = data;
for (DataListener listener: mDataListeners) {
listener.onDataChanged(mData);
}
}
public void registerListener(DataListener listener) {
mDataListeners.add(listener);
}
public String unregisterListener(DataListener listener) {
mDataListeners.remove(listener);
}
public String getData() {
return mData;
}
public static interface DataListener {
public void onDataChanged(String data);
}
}
- 讓一個工具的DataListener
- 閱讀和的DataListener的
onStart()
更新數據,以確保如果變化的時候做到了它被設置B還活着使用。
- 使用
DataHolder.getInstance().registerListener(this);
在A的onCreate/onStart中註冊偵聽器讓偵聽器更新數據。
- 在A的的onDestroy註銷監聽器/的onStop使用
DataHolder.getInstance().unregisterListener(this)
- 設定數據,並使用
DataHolder.getInstance().setData(data)
另外請注意,你可以讓第二個解決方案完全線程安全的,通過改變void registerListener()
到synchronized String registerListenerAndGetValue()
中頻信號B中任意監聽器你也使setValue同步。
基於一種誤解老答案
我以前的答案一般結果的處理並沒有完全回答這個問題,但它是:
如果你想將數據發送回一個活性的你應做到以下幾點:
使用乙完成後
- 始終以
startActivityForResult (Intent intent, int requestCode)
- 將結果入門C
- 處理的結果,當你回來一個通過實施
onActivityResult (int requestCode, int resultCode, Intent data)
作爲補充,你可以添加,所以你只有這樣它才savedInstanceState == null
在例如取A中的第一次數據的onCreate() 。
用戶可以按下BACK按鈕(並在'onActivityResult()'中獲得'RESULT_CANCEL'作爲結果代碼),而數據仍然在activity B中獲取。他將如何繼續進行這種情況?確切地說, – Luksprog 2012-02-17 19:19:02
。 B中的數據將在AsyncTask中獲取,並且在數據結束時將數據設置爲C.如果用戶按下B中的BACk,則活動將結束,但數據仍將在AsyncTask中獲取。 – hgm 2012-02-17 19:23:31
我誤解了這個問題。對不起。我在編輯的答案中添加了兩個解決方案。 – 2012-02-17 19:49:37