
カスタムデータクラスにSerializableをimplementsさせた時の挙動について疑問があります。
以下のカスタムデータはDBから取得した値を保持していて、ListViewの要素として表示させていました。そのセルをクリックした時に、その要素(IndividualData
)を次のページに渡していたのですが、毎回ではなく度々アプリが落ちる様になりました。
仕方ないのでIndividualDataのHasMapを作成し、String型の属性だけ受け渡しさせたら落ちなくなりました。
lang
1//カスタムデータクラス 2//public class IndividualData implements Serializable { //ボツ 3public class IndividualData { 4 5 public String name; 6 public String searchString; 7 public String imageString; 8 public Bitmap image; 9 public String title; 10 public String affiliation; 11 public String research; 12 public Uri uri; 13 14 public IndividualData(String name, String searchString, String imageString, String title, String affiliation, String research) { 15 this.name = name; 16 this.searchString = searchString; 17 this.imageString = imageString; 18 this.title = title; 19 this.affiliation = affiliation; 20 this.research = research; 21 } 22 23 public IndividualData(String name, String searchString, String imageString, String title, String affiliation, String research, Uri uri) { 24 this(name, searchString, imageString, title, affiliation, research); 25 this.uri = uri; 26 } 27 28 public void setImage(Bitmap bitmap) { 29 this.image = bitmap; 30 } 31 32}
lang
1//送る側のActivity 2public class SendActivity extends Activity { 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.sendactivity_list); 7 8 ---------処理---------- 9 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 10 @Override 11 public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 12 IndividualData id = (IndividualData) adapterView.getItemAtPosition(i); 13 Intent intent = new Intent(getApplication(), ReceiveActivity.class); 14 //intent.putExtra("IndividualData", id); //ボツ 15 intent.putExtra("IndividualDataImageString", id.imageString); 16 startActivity(intent); 17 } 18 }); 19 } 20}
lang
1public class ReceiveActivity extends Activity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.receiveactivity); 6 7 //IndividualData id = (IndividualData) getIntent().getSerializableExtra("IndividualData"); //ボツ 8 String imageString = (String) getIntent().getStringExtra("IndividualDataImageString"); 9 IndividualData id = IndividualDataCache.getIndividualData(imageString); 10 //IndividualDataCacheがHashMapで各IndividualDataを保持していて、getIndividualData(String)で指定したIndividualDataを取得します。 11 12 Log.d(CLASS_TAG, String.valueOf(id.name)); //成功 13 } 14}
望みの実装は出来たのですが、なぜSerializableだと失敗したのかがわかりません。
よろしければご教授下さい。
###追記・修正
エラーログを追記致しました。
勝手ながら、前記では分かりやすい様クラス、変数名を改変しておりました。以下変更点です。
IndividualData -> ProfessorData
SendActivity -> ProfessorListActivity
ReceiveActivity -> ProfessorDetailActivity
FATAL EXCEPTION: main java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = u_aizu.mhamada_lab.u_aizu.Activity.TopActivity.MainActivity.AcademicActivity.ProfessorData) at android.os.Parcel.writeSerializable(Parcel.java:1468) at android.os.Parcel.writeValue(Parcel.java:1416) at android.os.Parcel.writeArrayMapInternal(Parcel.java:686) at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330) at android.os.Bundle.writeToParcel(Bundle.java:1079) at android.os.Parcel.writeBundle(Parcel.java:711) at android.content.Intent.writeToParcel(Intent.java:7793) at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2639) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1507) at android.app.Activity.startActivityForResult(Activity.java:3930) at android.app.Activity.startActivityForResult(Activity.java:3890) at android.app.Activity.startActivity(Activity.java:4213) at android.app.Activity.startActivity(Activity.java:4181) at u_aizu.mhamada_lab.u_aizu.Activity.TopActivity.MainActivity.AcademicActivity.ProfessorListActivity$1$1.onItemClick(ProfessorListActivity.java:200) at android.widget.AdapterView.performItemClick(AdapterView.java:310) at android.widget.AbsListView.performItemClick(AbsListView.java:1145) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3066) at android.widget.AbsListView$3.run(AbsListView.java:3903) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.io.NotSerializableException: android.net.Uri$StringUri at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344) at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461) at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959) at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360) at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054) at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384) at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461) at android.os.Parcel.writeSerializable(Parcel.java:1463) at android.os.Parcel.writeValue(Parcel.java:1416) at android.os.Parcel.writeArrayMapInternal(Parcel.java:686) at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330) at android.os.Bundle.writeToParcel(Bundle.java:1079) at android.os.Parcel.writeBundle(Parcel.java:711) at android.content.Intent.writeToParcel(Intent.java:7793) at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2639) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1507) at android.app.Activity.startActivityForResult(Activity.java:3930) at android.app.Activity.startActivityForResult(Activity.java:3890) at android.app.Activity.startActivity(Activity.java:4213) at android.app.Activity.startActivity(Activity.java:4181) at u_aizu.mhamada_lab.u_aizu.Activity.TopActivity.MainActivity.AcademicActivity.ProfessorListActivity$1$1.onItemClick(ProfessorListActivity.java:200) at android.widget.AdapterView.performItemClick(AdapterView.java:310) at android.widget.AbsListView.performItemClick(AbsListView.java:1145) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3066) at android.widget.AbsListView$3.run(AbsListView.java:3903) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method)


回答1件
あなたの回答
tips
プレビュー