10

こんにちはJavaとAndroidのエキスパート。私は問題を抱えています。 私はXMPPベースのチャットアプリケーションを作っています。私を混乱させるいくつかのことがあります。カスタムオブジェクトが値渡しであるか、フラグメントとアクティビティの参照によって渡されますか?

私はSerializableを実装するRoom_Structureという名前のクラスを持っています。このクラスには、currentRoomという名前のオブジェクトがあります。

currentroomオブジェクトを2つの断片の間に入れてバンドルすると、うまく動作し、驚くほど参考になります。私はなぜそれが分かりません。それはこのように振るべきではありません。 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; 
} 

ある上記クラスは、コンストラクタと同様にゲッターとセッターを有します。

)はcurrentRoomオブジェクトが既に取り込まれ、ここで私はそれがFragment_Chat OnActivityCreated(からそれを取り出す

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(); 

をフラグメントに渡していますどのようにされていることを考えてみましょう:

今、ここでは、私がやっている何ですかこのような方法

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

これで、上記のコードは正常に動作しますフラグメント。唯一の問題は、オブジェクトの参照が新しいフラグメントに渡されることです。それは本当にどのように行動すべきかではありません。それはちょうど参照ではなく値を送るべきです。私は両方とも同じ参照またはアドレスを持つオブジェクトが参照

Sending Object : [email protected] 
Recieved Object: [email protected] 

によって渡されることを知っている方法をここで

です。 デバッグ

中にそれをチェックアウトした今、私はExpandibleListViewが含まれている活動を持って活動

でこの動作を再現傾けます。 BaseExpandableListAdapterから拡張することで、このExpandiblelistviewのアダプターを実装しました。このアダプタクラス名はWebsites_ListAdapter.javaです。コンストラクタ内のアクティビティのコンテキストも渡されます。 そして、リスト内でレイアウトをクリック可能にしました。そして、私はそれがクリックされたときに活動を開始したい。なぜ私はこれを長い話しにしたのか聞かないでください。 私はこの

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); 

のようなものWebsites_ListAdapterからこのオブジェクトを送信するが、私はLogcatに私はActivityContextを呼び出し、この時間はこのエラーを取得します。startActivity(I)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 

この件に関するお手伝いがあります。

答えて

2

違いは、フラグメントと同様にアクティビティオブジェクトを作成しないことです。システムにそれを実行するよう依頼します。インテントを作成してシステムにアクティビティを作成するよう依頼すると、インテント内のすべてのものがシリアライズされ、システムを介して新しいアクティビティに渡されます。同じオブジェクトを同時に共有する2つのアクティビティを同時に作成することはできません。 同じオブジェクト参照が本当に必要な場合は、常にシングルトンを作成できます。

+1

シリアル化の場合、常にインスタンスのコピーを作成する必要があります。私のテストは、シリアライゼーションとDe-serlizationの後に表示されます...両方のオブジェクトは、フラグメントの場合には同じインスタンスを参照します。私はこれがいかに可能であるか理解していません。 –

+1

@SaqibSaudあなたは、フラグメントとアクティビティで同じバングルオブジェクトを参照しています。彼らは同じです。バンドルメソッドputSerializableは、バンドル自体をシリアル化するまで、オブジェクトをシリアル化しません。あるアクティビティから別のアクティビティへのインテントでバンドルを渡すと、システムによってシリアライズされます。 – nicous

+1

@SherazKhiljiこれは通常のJavaの動作です。アクティビティーは、データをシリアル化してそれらの間で常に通信する必要があるために異なります。 – nicous

4

Bundleソースを見ると、オブジェクトを格納するためにマップが使用され、バンドル自体がシリアル化されているときにのみオブジェクトがシリアル化されることがわかります。

フラグメントに渡されたときにバンドルがシリアル化されていないようです。それは、最適化のトリックまたは実装 "バグ"になることができます。

ただし、新しいアクティビティを開始する場合は、バンドルはシリアル化され、デシリアライズされます。なぜなら、この例外はアクティビティに対してだけあるからです。

+0

おかげであなたはどのように私はこの問題を解決することができます私に言うことができます。データを送信する別の方法はありますか? –

+1

あなたは渡すすべてのオブジェクトに対してSerializableインターフェイスを実装できます。非直列化可能オブジェクト(ケース内のMultiUserChatなど)は、グローバルApplicationオブジェクトまたは静的変数に格納できます。 – MatrixDev

+0

しかし、私たちはフラグメントの場合と同じ振る舞いを模倣しませんか? –

0

問題はここにある:

Caused by: java.io.NotSerializableException: 

org.jivesoftware.smackx.muc.MultiUserChat 

答えは次のとおりです。MatrixDevので、@

public Class MultiUserChat implements Serializable 
関連する問題