こんにちは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
?
この件に関するお手伝いがあります。
シリアル化の場合、常にインスタンスのコピーを作成する必要があります。私のテストは、シリアライゼーションとDe-serlizationの後に表示されます...両方のオブジェクトは、フラグメントの場合には同じインスタンスを参照します。私はこれがいかに可能であるか理解していません。 –
@SaqibSaudあなたは、フラグメントとアクティビティで同じバングルオブジェクトを参照しています。彼らは同じです。バンドルメソッドputSerializableは、バンドル自体をシリアル化するまで、オブジェクトをシリアル化しません。あるアクティビティから別のアクティビティへのインテントでバンドルを渡すと、システムによってシリアライズされます。 – nicous
@SherazKhiljiこれは通常のJavaの動作です。アクティビティーは、データをシリアル化してそれらの間で常に通信する必要があるために異なります。 – nicous