2013-04-24 2 views
2

У меня есть объект Custom Type, который реализует Serializable, и я могу успешно передать этот объект через мои действия.Дополнительные намерения не передаются по ссылке?

Сейчас ситуация такова:

О деятельности 1 экземпляр CustomObject имеет свойство типа String со значением «A» устанавливается и передается на операцию 2 как Extra:

Intent intent = new Intent(getApplicationContext(), Activity_2.class); 
intent.putExtra("CUSTOM_OBJECT", customObjectInstance); 

startActivityForResult(intent, 0); 

В Activity 2 я извлекаю CustomObject из Intent и изменяю значение свойства от «A» до «B».

Когда я нажимаю кнопку «Назад», перейдя из операции 2 обратно в «Активность 1», значение свойства CustomObject снова «A»!

Я проверил хэш-код объекта и подтвердил, что это тот же экземпляр для обеих операций, и до сих пор не может понять, почему это происходит.

EDIT:

В соответствии с просьбой, о коде, где я установить значение свойства, это так просто, как это может быть:

На активность 2:

CustomObject obj = (CustomObject) getIntent().getExtras().getSerializable("CUSTOM_OBJECT"); 
obj.setProperty("B"); 
+1

Пожалуйста, отправьте код, в котором вы указали свойство. Java передает * все * по значению. Когда вы передаете «объект», вы передаете копию значения ссылки на объект. Это просто длинный int. Объект существует в адресе памяти A. Экземпляр объекта в Activity 1 на самом деле является указателем на адрес A, сохраненным в адресе B. Действие 2 получает копию этого указателя, сохраненную в адресе C. Ничто из этого не отвечает на ваш вопрос, который, поскольку появляются указатели чтобы быть одинаковым, является нечетным. Обратите внимание, что hash equals не гарантирует «тот же объект». http://www.ibm.com/developerworks/java/library/j-jtp05273/index.html – Simon

+0

Кстати, пожалуйста, также покажите, как вы читаете значение из дополнительных функций в действии 2. – Simon

+0

Так что вы говорите, что если мне нужно будет модифицировать и прочитать экземпляр одного объекта из двух разных видов деятельности, я должен пойти с глобальной переменной? – Aquanauta

ответ

0

Are вы вызываете setResult (int) в Activity, возвращающем результат? Вот документы по началу деятельности для результатов.

Он должен всегда предоставлять код результата, который может быть стандартными результатами RESULT_CANCELED, RESULT_OK или любыми пользовательскими значениями, начинающимися с RESULT_FIRST_USER. Кроме того, он может возвращать обратно намерение, содержащее любые дополнительные данные, которые он хочет. Вся эта информация появляется на родительском Activity.onActivityResult(), а также на исходный идентификатор целого числа.

Если дочернее мероприятие по какой-либо причине (например, сбой) не работает, родительская активность получит результат с кодом RESULT_CANCELED.

http://developer.android.com/reference/android/app/Activity.html#StartingActivities

2

дополнительные Intent содержат только значения. Вы можете обрабатывать параметры по ссылке, расширяя класс Application и развертывая «глобальные» переменные.

Хотя вы выражаете, что оба хэш-кода объекта одинаковы, я уверен, что каждый Activity обрабатывает свой собственный набор локальных переменных. В ваших тестах объекты в действиях A и B не зависят друг от друга.

Надеюсь, это поможет.

+0

Извините, но полная чепуха. Java передает все по значению. Экземпляр объекта передается как копия значения ссылочного указателя. Кроме того, предлагая глобальные переменные для решения этой проблемы, является полностью анти-ООП. «достаточно уверен, что каждая активность обрабатывает свой собственный набор переменных». Я предполагаю, что вы имеете в виду поля классов, которые, если не статические, могут обрабатываться каким-то другим способом? – Simon

+0

Я понимаю, что вы говорите. Реализация глобальных переменных - это уродливая модель, используемая и неэффективная. Я пытался доказать, что у вас может быть «глобальный» репозиторий для обработки «того же» объекта. В поле полей полей вы правы. «Собственный набор переменных» Activity - это поля его класса. – Andres

+0

И на самом деле я не был ясен. Вы правы в том, что вы не можете передавать объекты через дополнительные функции. Downvoice отменен. – Simon

Смежные вопросы