Передать массив пользовательских объектов в Intent 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 строк с его сеттерами и геттерами!

3 ответа

Я дал реализации, сериализуемые в обоих классах, но я не могу выполнить маршалл... ошибка времени выполнения в вызывающей функции при запуске строки. Пожалуйста, помогите, как продолжить!

Поскольку вы используете Serializable, вы не можете сделать это, как сейчас. Я предлагаю вам обернуть ваш ArrayList в класс, например с именем DataWrapper. Этот класс также должен реализовывать Serializable, и тогда вы сможете передавать ArrayList через Intent.

Пример:

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, который непосредственно предназначен для передачи объектов через Activity, но я обычно использую интерфейс Serializable, и он всегда делает свое дело.

Также будьте осторожны с опечатками. Вы кладете объект с ключом task и вы должны получить его с тем же ключом, а не с помощью списка задач.

Реализация Serializable считается низкой производительностью, когда Parcelable поощряется.

У меня был точно такой же вопрос, и в то же время ParcelableЯ обнаружил, что статические переменные не так уж плохи для этой задачи.

Вы можете просто создать

public static ArrayList<Parliament> myObjects = .. 

и использовать его из других мест через MyRefActivity.myObjects

Я не был уверен, что подразумевают публичные статические переменные в контексте приложения с действиями. Если у вас также есть сомнения относительно этого или аспектов производительности этого подхода, обратитесь к:

Приветствия.

Сделайте ваш объект класса Parcelable позже, попробуйте использовать

bundlename.putParcelableArrayList
Другие вопросы по тегам