привет экспертов по Java и Android. У меня проблема. Я делаю приложение для чата на основе XMPP. Есть несколько вещей, которые меня путают.
У меня есть класс с именем Room_Structure, который реализует Serializable. Этот класс имеет объект с именем currentRoom.
Если я передаю объект currentroom между двумя фрагментами, поставив его в комплекте, он отлично работает и, на удивление, передается по ссылке. Я не знаю, почему. Он не должен вести себя так. btw Я использую библиотеку поддержки Android?
Но если я передаю объект 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;
}
Вышеупомянутый класс имеет конструкторы, а также getter и seters.
Теперь вот что я делаю:
Учтите, что объект 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 : [email protected]
Recieved Object: [email protected]
оба имеют одинаковые ссылки или адрес. Проверено в Отладка
Теперь я не могу воспроизвести это поведение в действиях
У меня есть Activity, который содержит ExpandibleListView. Я реализовал адаптер для этого Expandiblelistview, расширив его из BaseExpandableListAdapter. Это имя класса адаптера - Websites_ListAdapter.java. Он также передал контекст активности в своем конструкторе. И я сделал макет, который можно щелкнуть в списке. И я хочу начать работу, когда нажимаем. пожалуйста, не спрашивайте, почему я сделал это долго. Я отправляю этот объект из этого веб-сайта_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
Я знаю, что есть много способов передать объекты между действиями, но я хочу знать, почему это происходит так и что делает сериализуемое в фоновом режиме?
Любая помощь по этому вопросу очень ценится.