chào các chuyên gia Java và Android. Tôi đang gặp vấn đề. Tôi đang tạo một ứng dụng trò chuyện dựa trên XMPP. Có một vài điều khiến tôi bối rối.Đối tượng tùy chỉnh Có được truyền theo giá trị hoặc được chuyển bởi Tham chiếu trong Phân đoạn và hoạt động không?
Tôi có một lớp có tên Room_Structure triển khai Serializable. Lớp này có một đối tượng có tên là currentRoom.
Nếu tôi đang vượt qua phòng hiện tại đối tượng giữa hai đoạn bằng cách đặt nó vào trong một gói làm việc tốt và đáng ngạc nhiên nó được chuyển qua tham chiếu. tôi không biết tại sao lại thế. Nó không nên cư xử như thế này. btw tôi đang sử dụng thư viện Hỗ trợ Android?
Nhưng nếu tôi đang chuyển đối tượng currentRoom giữa các Hoạt động sử dụng gói và đặt gói đó vào mục đích thì tôi đang gặp sự cố bất cứ khi nào tôi cố bắt đầu hoạt động mới bằng ý định đó.
Để biết thêm Mô tả Đây là Bộ luật
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;
}
Lớp trên có nhà xây dựng cũng như getter và setter.
Bây giờ đây là những gì tôi đang làm:
xem xét đó đối tượng currentRoom đã được dân cư và đây là cách tôi đi qua nó để fragment
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();
lấy nó từ Fragment_Chat OnActivityCreated() phương pháp như thế này
Bundle extras = getArguments();
Room_Structure recievedRoom = (Room_Structure) extras.getSerializable("RoomObject");
Bây giờ mã ở trên đang hoạt động Chỉ cần sử dụng cho Các mảnh vỡ. vấn đề duy nhất là tham chiếu của đối tượng được truyền tới đoạn mới. Đó không phải là cách nó thực sự hành xử. Nó chỉ nên gửi giá trị không tham chiếu.
Dưới đây là làm thế nào tôi biết rằng đối tượng được thông qua tham khảo
Sending Object : [email protected]
Recieved Object: [email protected]
cả hai đều có cùng một tài liệu tham khảo hoặc Địa chỉ. Kiểm tra nó ra trong Gỡ rối
Bây giờ tôi không thể tái tạo hành vi này trong hoạt động
Tôi có một Hoạt động, trong đó có một ExpandibleListView. Tôi đã triển khai bộ điều hợp cho Expandiblelistview này bằng cách mở rộng nó từ BaseExpandableListAdapter. Tên lớp bộ điều hợp này là Websites_ListAdapter.java. Nó cũng được thông qua bối cảnh của hoạt động trong constructor của nó. Và tôi đã thực hiện bố cục có thể nhấp trong danh sách. Và tôi muốn bắt đầu một hoạt động khi được nhấp. xin vui lòng không hỏi tại sao tôi đã làm điều này một câu chuyện dài của nó. Tôi Sending đối tượng này từ Websites_ListAdapter rằng như thế này
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);
Nhưng tôi nhận được lỗi này trong Logcat Lần này khi tôi gọi 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
Tôi biết có rất nhiều cách để vượt qua đối tượng giữa các hoạt động nhưng tôi muốn biết tại sao nó lại xảy ra theo cách này và những gì không serializable làm trong nền?
Bất kỳ Trợ giúp nào về vấn đề này được đánh giá cao.
Trong trường hợp serialization, nó luôn luôn phải tạo một bản sao của cá thể. nhưng thử nghiệm của tôi cho thấy sau khi serialization và De-serlization ... cả hai đối tượng tham chiếu đến cùng một thể hiện trong trường hợp của các mảnh. Tôi không hiểu làm thế nào điều này có thể được có thể. –
@SaqibSaud bạn đang tham chiếu cùng một đối tượng bungle trong đoạn và trong hoạt động. Họ giống nhau. Phương thức bundle putSerializable không tuần tự hóa đối tượng cho đến khi bạn tự tuần tự hóa gói. Khi bạn vượt qua các gói trong một ý định từ một hoạt động khác, nó được serialized bởi hệ thống. – nicous
@SherazKhilji đó là hành vi java bình thường. Các hoạt động khác nhau vì bạn luôn cần tuần tự hóa dữ liệu để giao tiếp giữa chúng. – nicous