web-dev-qa-db-ja.com

ユーザー定義オブジェクトの配列リストをインテントに渡すandroid

次のように、arraylistの構造をインテントに渡そうとしています。使用している呼び出し関数で

ArrayList<Parliament> s=(ArrayList<Parliament>)msg.obj;                                 
Intent i = new Intent(ReadTasks.this, GenrateTasks.class);                          
i.putExtra("tasks", s);
startActivity(i);

そして呼び出された関数で

Bundle b = getIntent().getExtras();
if(b!=null)
{           
    ArrayList<Parliament> as = (ArrayList<Parliament>)b.getSerializable("tasklist");
}

両方のクラスでシリアライズ可能な実装を指定しましたが、マーシャルできなくなりました。行開始アクティビティの呼び出し関数で実行時エラーが発生しました。続行する方法を手伝ってください!

編集1:スタックトレース:

04-01 22:21:53.999: E/AndroidRuntime(2078): FATAL EXCEPTION: main
04-01 22:21:53.999: E/AndroidRuntime(2078): Java.lang.RuntimeException: Parcel: unable to marshal value com.viralm.readjson.Parliament@413597f0
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.os.Parcel.writeValue(Parcel.Java:1137)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.os.Parcel.writeList(Parcel.Java:524)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.os.Parcel.writeValue(Parcel.Java:1097)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.os.Parcel.writeMapInternal(Parcel.Java:493)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.os.Bundle.writeToParcel(Bundle.Java:1612)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.os.Parcel.writeBundle(Parcel.Java:507)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.content.Intent.writeToParcel(Intent.Java:5846)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.Java:1606)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1379)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.app.Activity.startActivityForResult(Activity.Java:3190)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.app.Activity.startActivity(Activity.Java:3297)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at com.viralm.readjson.ReadTasks$1.handleMessage(ReadTasks.Java:61)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.os.Handler.dispatchMessage(Handler.Java:99)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.os.Looper.loop(Looper.Java:137)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Android.app.ActivityThread.main(ActivityThread.Java:4340)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Java.lang.reflect.Method.invokeNative(Native Method)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at Java.lang.reflect.Method.invoke(Method.Java:511)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:784)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:551)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at dalvik.system.NativeStart.main(Native Method)

私のParlimentクラスには、セッターとゲッターを含む5つの文字列があります。

8
bharath

両方のクラスでシリアライズ可能な実装を指定しましたが、マーシャルできなくなりました。行開始アクティビティの呼び出し関数で実行時エラーが発生しました。続行する方法を手伝ってください!

Serializable を使用しているため、現在のように実行することはできません。 ArrayListを、たとえばDataWrapperという名前のクラスにラップすることをお勧めします。このクラスもSerializableを実装する必要があり、Intentを介してArrayListを渡すことができます。

例:

public class DataWrapper implements Serializable {

   private ArrayList<Parliament> parliaments;

   public DataWrapper(ArrayList<Parliament> data) {
      this.parliaments = data;
   }

   public ArrayList<Parliament> getParliaments() {
      return this.parliaments;
   }

}

そして使用法:

Intent i = new Intent(...);
i.putExtra("data", new DataWrapper(yourArrayList));

および取得:

DataWrapper dw = (DataWrapper) getIntent().getSerializableExtra("data");
ArrayList<Parliament> list = dw.getParliaments();

注意:

Parcelable インターフェースを使用するオプションもあります。これを使用する場合は、次のメソッドを使用してArrayListを配置および取得できます。

intent.putParcelableArrayListExtra("key", ArrayList<T extends Parcelable> list);
getIntent().getParcelableArrayListExtra("key");


通常、アクティビティを介してオブジェクトを渡すために直接指定されたParcelableインターフェイスを使用することをお勧めしますが、私は通常Serializableインターフェイスを使用し、常にトリックを行います。

また、タイプミスにも注意してください。オブジェクトをキーtaskで配置しているので、タスクリストではなく同じキーでオブジェクトを取得する必要があります。

43
Simon Dorociak

Serializableの実装は、Parcelableが推奨されている場合、パフォーマンスが低いと見なされます。

私はまったく同じ質問をしましたが、それでもParcelableに悩まされていましたが、静的変数はそれほど悪い考えではないことがわかりましたタスクのために。

簡単に作成できます

public static ArrayList<Parliament> myObjects = .. 

MyRefActivity.myObjectsを介して他の場所から使用します

アクティビティを含むアプリケーションのコンテキストで、パブリック静的変数が何を意味するのかわかりませんでした。これまたはこのアプローチのパフォーマンスの側面についても疑問がある場合は、以下を参照してください。

乾杯。

3
Orkun Ozen

オブジェクトクラスをParcelableにして後で使用してみてください

bundlename.putParcelableArrayList
1
Soniya Mohan