Не сохранять статические ссылки на адаптер.Это действительно приведет к утечке памяти и плохому поведению.
Кажется, я неправильно понял первый раз.Вот обновленный ответ:
Первое решение
Самое красивое решение - реализовать поставщик контента для хранения данных и запросить этого поставщика контента как в А, так и в В.Обновите данные в B с помощью contentProvider.insert () и прочитайте данные с помощью contentProvider.query (), возвращая, например, SQLiteCursor, если он поддерживается базой данных, или MatrixCursor, если вы просто сохраняете их в памяти в поставщике контента.
Основные шаги (без CursorLoader):
- В onCreate of A вы регистрируетесь как contentobserver, используя
ContentResolver.registerContentObserver(uri, true, this)
, где uri - это URI, используя некоторую заданную вами схему. - В onCreate of A вы получаете данные, запрашивая контент-провайдер, используя
ContentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
, где projection, selection, selectionArgs и sortOrder могут быть тем, что подходит вашему контент-провайдеру (может быть, null).Uri относится к данным, которые вы хотите запросить, и является вашим выбором. - Когда данные загружаются в B, вы звоните
ContentResolver.insert()
.В insert
вашего контент-провайдера вы вызываете ContentResolver.notifyChange (Uri uri, null, null)
, где uri - это URI, который вы использовали на шаге 1. - Реализация onChange (логическое selfChange) в A и запрос к поставщику контента при его вызове.
Обратите внимание, что вам вообще не понадобится вызывать registerContentObserver, если вы используете CursorLoaders!Он получит новый курсор в загрузчике, так как при уведомлении об изменении он автоматически запрашивает.
Второе решение Менее привлекательное решение - реализовать одноэлементный объект, который обрабатывает данные.Что-то вроде:
Реализация класса
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);
}
}
- Создание A реализует DataListener
- Чтение и обновление данных в
onStart()
изDataListener, чтобы убедиться, что он установлен, если изменение было сделано, когда B был жив, используя DataHolder.getInstance().getData()
. - Зарегистрируйте слушателя в onCreate / onStart A, используя
DataHolder.getInstance().registerListener(this);
Позвольте слушателю обновить данные. - Отмените регистрацию слушателя в onDestroy / onStop A, используя
DataHolder.getInstance().unregisterListener(this)
- Установите данные и подайте сигнал любому слушателю в B, используя
DataHolder.getInstance().setData(data)
Также обратите внимание, что вы можете сделать второе решениеполностью поточно-ориентированный, изменив void registerListener()
на synchronized String registerListenerAndGetValue()
, если вы также синхронизируете setValue.
Старый ответ, основанный на недоразумении
Мой старый ответ для общей обработки результатовне совсем ответил на вопрос, но это было:
Если вы хотите отправить данные обратно в упражнение A, вы должны сделать следующее:
- Всегда начинать B с
startActivityForResult (Intent intent, int requestCode)
- Установить результат, когда сделано в B, используя
setResult (int resultCode)
- Обработайте результат, когда вы вернетесь к A, выполнив
onActivityResult (int requestCode, int resultCode, Intent data)
В качестве дополнения вы можете добавить, чтобы вы только в первый раз выбирали данные в A, выполняя это.только если savedInstanceState == null
в, например, onCreate ().