10

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.

Trả lời

2

Sự khác biệt là bạn không tạo đối tượng hoạt động như bạn làm với các đoạn, bạn yêu cầu hệ thống thực hiện. Bạn tạo ra một mục đích để yêu cầu hệ thống tạo ra hoạt động, mọi thứ trong mục đích được tuần tự hóa và sau đó chuyển qua hệ thống đến hoạt động mới. Không thể tạo hai hoạt động đồng thời chia sẻ cùng một đối tượng. Nếu bạn thực sự cần tham chiếu đối tượng giống nhau, bạn luôn có thể tạo ra một singleton.

+1

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ể. –

+1

@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

+1

@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

4

Nếu bạn nhìn vào các nguồn Bundle bạn sẽ thấy rằng nó sử dụng Bản đồ để lưu trữ các đối tượng và sẽ chỉ tuần tự hóa các đối tượng khi Bản thân gói được tuần tự hóa.

Dường như Bundle không được tuần tự hóa khi được chuyển đến các đoạn. Nó có thể được tối ưu hóa lừa hoặc thực hiện "lỗi".

Nhưng khi bạn muốn bắt đầu hoạt động mới Nhóm sẽ được đăng theo thứ tự và không được deserialized. Đó là lý do tại sao bạn chỉ có ngoại lệ này cho Hoạt động.

+0

Cảm ơn @ MatrixDev Vì vậy, bạn có thể cho tôi biết làm thế nào tôi có thể giải quyết vấn đề này. Có cách tiếp cận nào khác để gửi dữ liệu không? –

+1

bạn có thể triển khai giao diện Serializable cho tất cả các đối tượng bạn muốn chuyển. Các đối tượng không thể tuần tự hóa (như MultiUserChat trong trường hợp của bạn) có thể được lưu trữ trong đối tượng Application hoặc các biến tĩnh chung. – MatrixDev

+0

Nhưng chúng ta không thể bắt chước hành vi tương tự như trong trường hợp của mảnh vỡ? –

0

Vấn đề là ở đây:

Caused by: java.io.NotSerializableException: 

org.jivesoftware.smackx.muc.MultiUserChat 

Câu trả lời là:

public Class MultiUserChat implements Serializable 
Các vấn đề liên quan