Выполняются ли пользовательские объекты по значению или переданы по ссылке в разделе «Фрагменты и действия».?

Привет Java и Android экспертов. У меня проблема. Я делаю приложение для чата на основе XMPP. Есть несколько вещей, которые меня путают.

У меня есть класс с именем Room_Structure, который реализует Serializable . Этот класс имеет объект с именем currentRoom .

Если я перехожу к текущему объекту между двумя фрагментами, помещая его в связку, он отлично работает и, на удивление, передается по ссылке. Я не знаю, почему. Он не должен вести себя так. Btw Я использую Android Support library?

Но если я передаю этот объект currentRoom между действиями с использованием пакета и помещением этого пакета в намерение, то я получаю сбой, когда я пытаюсь начать новую деятельность с использованием этого намерения.

Для более подробного описания Здесь приведен код

public class Room_Structure implements Serializable { private static final long serialVersionUID = 1L; private String Rname; private ArrayList<Message_Pattern> msg_list; private MultiUserChat XmppSession; private boolean Background; private boolean Modified; private boolean Destroyed; } 

Вышеупомянутый класс имеет конструкторы, а также геттер и сеттеры.

Теперь вот что я делаю:

Учтите, что объект currentRoom уже заполнен, и вот как я передаю его фрагменту

  Bundle b = new Bundle(); b.putSerializable("RoomObject", currentRoom); Fragment_Chat newChat = new Fragment_Chat(); newChat.setArguments(b); FragmentManager fm = getChildFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.fl_chatFragment, newChat); ft.addToBackStack(null); ft.commit(); 

Извлечение его из метода Fragment_Chat OnActivityCreated (), подобного этому

 Bundle extras = getArguments(); Room_Structure recievedRoom = (Room_Structure) extras.getSerializable("RoomObject"); 

Теперь этот выше код работает Отлично подходит для фрагментов . Единственная проблема заключается в том, что ссылка на объект передается новому фрагменту. Это не то, как он должен себя вести. Он должен просто отправить значение не ссылкой.

Вот как я знаю, что объекты передаются по ссылке

 Sending Object : com.software.chat.Classes.Room_Structure@425585e8 Recieved Object: com.software.chat.Classes.Room_Structure@425585e8 

Оба имеют одну и ту же ссылку или адрес. Проверено во время отладки

Теперь я не могу воспроизвести это поведение в действиях

У меня есть Activity, который содержит ExpandibleListView. Я реализовал адаптер для этого Expandiblelistview, расширив его из BaseExpandableListAdapter. Это имя класса адаптера – Websites_ListAdapter.java. Он также передал контекст активности в своем конструкторе. И я сделал макет, который можно щелкнуть в списке. И я хочу начать действие, когда нажимаем. Пожалуйста, не спрашивайте, почему я сделал это в своей длинной истории. Я отправляю этот объект из этого Websites_ListAdapter, как это

 Intent i=new Intent(ActivityContext, ChatScreen.class); Bundle b = new Bundle(); b.putSerializable("RoomObject", currentRoom); i.putExtras(b); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); ActivityContext.startActivity(i); 

Но я получаю эту ошибку в Logcat. На этот раз, когда я вызываю ActivityContext.startActivity (i)

 04-25 15:38:07.474: E/AndroidRuntime(10250): FATAL EXCEPTION: main 04-25 15:38:07.474: E/AndroidRuntime(10250): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.software.chat.Classes.Room_Structure) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.os.Parcel.writeSerializable(Parcel.java:1279) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.os.Parcel.writeValue(Parcel.java:1233) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.os.Parcel.writeMapInternal(Parcel.java:591) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.os.Bundle.writeToParcel(Bundle.java:1619) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.os.Parcel.writeBundle(Parcel.java:605) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.content.Intent.writeToParcel(Intent.java:6814) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.app.ActivityManagerProxy.startActivity (ActivityManagerNative.java:1910) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1415) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.app.Activity.startActivityForResult(Activity.java:3446) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.app.Activity.startActivityForResult(Activity.java:3407) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.support.v4.app.FragmentActivity.startActivityForResult (FragmentActivity.java:817) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.app.Activity.startActivity(Activity.java:3617) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.app.Activity.startActivity(Activity.java:3585) 04-25 15:38:07.474: E/AndroidRuntime(10250): at com.software.chat.Adapters.Websites_ListAdapter$1.onClick (Websites_ListAdapter.java:211) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.view.View.performClick(View.java:4211) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.view.View$PerformClick.run(View.java:17267) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.os.Handler.handleCallback(Handler.java:615) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.os.Handler.dispatchMessage(Handler.java:92) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.os.Looper.loop(Looper.java:137) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.app.ActivityThread.main(ActivityThread.java:4898) 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.lang.reflect.Method.invokeNative(Native Method) 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.lang.reflect.Method.invoke(Method.java:511) 04-25 15:38:07.474: E/AndroidRuntime(10250): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1006) 04-25 15:38:07.474: E/AndroidRuntime(10250): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 04-25 15:38:07.474: E/AndroidRuntime(10250): at dalvik.system.NativeStart.main(Native Method) 04-25 15:38:07.474: E/AndroidRuntime(10250): Caused by: java.io.NotSerializableException: org.jivesoftware.smackx.muc.MultiUserChat 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364) 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.io.ObjectOutputStream.writeObjectInternal (ObjectOutputStream.java:1671) 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979) 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.io.ObjectOutputStream.defaultWriteObject (ObjectOutputStream.java:368) 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074) 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404) 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.io.ObjectOutputStream.writeObjectInternal (ObjectOutputStream.java:1671) 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 04-25 15:38:07.474: E/AndroidRuntime(10250): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 04-25 15:38:07.474: E/AndroidRuntime(10250): at android.os.Parcel.writeSerializable(Parcel.java:1274) 04-25 15:38:07.474: E/AndroidRuntime(10250): ... 24 more 

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

Любая помощь по этому вопросу очень ценится.

Solutions Collecting From Web of "Выполняются ли пользовательские объекты по значению или переданы по ссылке в разделе «Фрагменты и действия».?"

Разница в том, что вы не создаете объект активности, как вы делаете с фрагментами, вы просите систему сделать это. Вы создаете намерение, чтобы попросить систему создать активность, каждая вещь в намерении сериализуется, а затем передается через систему в новое действие. Невозможно создать два действия одновременно с одним и тем же объектом. Если вам действительно нужна одна и та же ссылка на объект, вы всегда можете создать синглтон.

Если вы изучите источники Bundle, вы увидите, что он использует карту для хранения объектов и будет сериализовать объекты, когда сам пакет будет сериализован.

Кажется, что Bundle не сериализуется при передаче фрагментам. Это может быть трюк оптимизации или реализация «ошибка».

Но когда вы хотите начать новую деятельность, Bundle будет сериализован и десериализован. То почему вы имеете это исключение только для деятельности.

Проблема здесь:

 Caused by: java.io.NotSerializableException: org.jivesoftware.smackx.muc.MultiUserChat 

Ответ:

 public Class MultiUserChat implements Serializable