Intención putExtra ArrayList <NameValuePair>

¿Alguien sabe cómo agregar un ArrayList<NameValuePair> a un Intent como un extra?

 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("first_name", first_name)); nameValuePairs.add(new BasicNameValuePair("last_name", last_name)); nameValuePairs.add(new BasicNameValuePair("email", email)); nameValuePairs.add(new BasicNameValuePair("password", password)); /* Move on to step 2 */ Intent intent = new Intent(RegisterActivity1.this, RegisterActivity2.class); intent.putExtra("nvp", nameValuePairs); startActivity(intent); 

Aquí está la declaración de clase para RegisterActivity2:

 public class RegisterActivity2 extends Activity implements Serializable { } 

El error en el logcat es:

 > Parcel: unable to marshal value first_name="whatever" 

Después de implementar la sugerencia de Ted Hopp, sigo recibiendo un error. Aquí está el rastreo de la pila:

 08-04 22:10:16.095: E/AndroidRuntime(5065): FATAL EXCEPTION: main > 08-04 22:10:16.095: E/AndroidRuntime(5065): > java.lang.RuntimeException: Unable to start activity > ComponentInfo{/.RegisterActivity2}: java.lang.RuntimeException: > Parcelable encountered IOException reading a Serializable object (name > = database.NVP) 08-04 22:10:16.095: E/AndroidRuntime(5065): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2070) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > android.app.ActivityThread.access$600(ActivityThread.java:135) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > android.os.Handler.dispatchMessage(Handler.java:99) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.os.Looper.loop(Looper.java:137) 08-04 22:10:16.095: > E/AndroidRuntime(5065): at > android.app.ActivityThread.main(ActivityThread.java:4849) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > java.lang.reflect.Method.invokeNative(Native Method) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > java.lang.reflect.Method.invoke(Method.java:511) 08-04 22:10:16.095: > E/AndroidRuntime(5065): at > com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > dalvik.system.NativeStart.main(Native Method) 08-04 22:10:16.095: > E/AndroidRuntime(5065): Caused by: java.lang.RuntimeException: > Parcelable encountered IOException reading a Serializable object (name > = database.NVP) 08-04 22:10:16.095: E/AndroidRuntime(5065): at android.os.Parcel.readSerializable(Parcel.java:2144) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.os.Parcel.readValue(Parcel.java:2016) 08-04 22:10:16.095: > E/AndroidRuntime(5065): at > android.os.Parcel.readListInternal(Parcel.java:2235) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.os.Parcel.readArrayList(Parcel.java:1655) 08-04 22:10:16.095: > E/AndroidRuntime(5065): at > android.os.Parcel.readValue(Parcel.java:1986) 08-04 22:10:16.095: > E/AndroidRuntime(5065): at > android.os.Parcel.readMapInternal(Parcel.java:2226) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.os.Bundle.unparcel(Bundle.java:223) 08-04 22:10:16.095: > E/AndroidRuntime(5065): at > android.os.Bundle.getSerializable(Bundle.java:1254) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.content.Intent.getSerializableExtra(Intent.java:4268) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > .RegisterActivity2.onCreate(RegisterActivity2.java:24) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.app.Activity.performCreate(Activity.java:5244) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): at > android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2034) > 08-04 22:10:16.095: E/AndroidRuntime(5065): ... 11 more 08-04 > 22:10:16.095: E/AndroidRuntime(5065): Caused by: > java.io.InvalidClassException: > org.apache.http.message.BasicNameValuePair; IllegalAccessException > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > java.io.ObjectStreamClass.resolveConstructorClass(ObjectStreamClass.java:694) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:655) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1816) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) > 08-04 22:10:16.095: E/AndroidRuntime(5065): at > android.os.Parcel.readSerializable(Parcel.java:2142) 08-04 > 22:10:16.095: E/AndroidRuntime(5065): ... 23 more 

Como otros han señalado, cuando desea pasar un array como un intento extra, los elementos necesitan implementar Serializable . En su caso, el enfoque es bastante simple (no bastante – vea más abajo): defina su propia subclase de BasicNameValuePair y declare que implementa la interfaz.

 public class NVP extends BasicNameValuePair implements Serializable { public NVP(String name, String value) { super(name, value); } } 

Entonces puedes usarlo como lo has estado intentando:

 ArrayList<NVP> nameValuePairs = new ArrayList<NVP>(); nameValuePairs.add(new NVP("first_name", first_name)); nameValuePairs.add(new NVP("last_name", last_name)); nameValuePairs.add(new NVP("email", email)); nameValuePairs.add(new NVP("password", password)); /* Move on to step 2 */ Intent intent = new Intent(RegisterActivity1.this, RegisterActivity2.class); intent.putExtra("nvp", nameValuePairs); startActivity(intent); 

En el extremo receptor, tendrá que sacarlo con:

 ArrayList<NVP> nameValuePairs = (ArrayList<NVP>) intent.getSerializable("nvp"); 

EDITAR Bien, lo anterior no funcionará porque BasicNameValuePair no tiene un constructor predeterminado y el mecanismo de serialización requiere que las clases de antepasados ​​no serializables tengan un constructor predeterminado. De lo contrario obtendrá una excepción en la deserialización.

Desafortunadamente, esto significa que la solución no es tan simple como lo hice. Una Parcelable es definir su propia clase para implementar Parcelable , como @keerthana murugesan sugiere en su respuesta . Si has implementado Parcelable antes, sabes que es un poco de dolor. Otro trabajo en torno a es definir una clase que envuelve un BasicNameValuePair (en lugar de derivar de él) y gestiona su propia serialización:

 public class NVP implements NameValuePair, Serializable { private BasicNameValuePair nvp; public NVP(String name, String value) { nvp = new BasicNameValuePair(name, value); } @Override public String getName() { return nvp.getName(); } @Override public String getValue() { return nvp.getValue(); } // serialization support private static final long serialVersionUID = 1L; private void writeObject(ObjectOutputStream out) throws IOException { out.writeString(nvp.getName()); out.writeString(nvp.getValue()); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { nvp = new BasicNameValuePair(in.readString(), in.readString()); } private void readObjectNoData() throws ObjectStreamException { // nothing to do } } 

Tuve el mismo problema, tratando de enviar objetos en ArrayList sin implementar Seiralizable en la clase Object.

La solución de acceso directo era envolver ArrayList en Bundle.

Por lo tanto, en la primera actividad ->

 ArrayList<Object> objects = new ArrayList<Object>(); // Object class does not implement Serializable interface Bundle extra = new Bundle(); extra.putSerializable("objects", objects); Intent intent = new Intent(getBaseContext(), ShowSpread.class); intent.putExtra("extra", extra); 

Segunda actividad ->

 Bundle extra = getIntent().getBundleExtra("extra"); ArrayList<Object> objects = (ArrayList<Object>) extra.getSerializable("objects") 

Funciona bien.

Necesita pasar una matriz de objetos como Serializable en la intención. La matriz de objetos debe constar de objetos que son inturn Serializable.

 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("first_name", first_name)); nameValuePairs.add(new BasicNameValuePair("last_name", last_name)); nameValuePairs.add(new BasicNameValuePair("email", email)); nameValuePairs.add(new BasicNameValuePair("password", password)); 

Aquí BaseNameValuePair necesita ser una clase que implemente Serializable . Use toArray de ArrayList en poner, y typecast a Serializable . En su actividad getter use getSerializable en la intención.

Para que esto funcione, el tipo genérico de su lista debe implementar Serializable .

Esto se puede lograr utilizando la interfaz Parcelable .

  1. Haga que su clase BasicNameValuePair implemente Interfaz Parcelable esto para más referencia.

     public class BasicNameValuePair implements Parcelable{ } 
  2. Agregue estos objetos a una ArrayList como lo hizo anteriormente,

     ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("first_name", first_name)); nameValuePairs.add(new BasicNameValuePair("last_name", last_name)); nameValuePairs.add(new BasicNameValuePair("email", email)); nameValuePairs.add(new BasicNameValuePair("password", password)); 
  3. Pase estos en la intent con putParcelableArrayListExtra() .

     intent.putParcelableArrayListExtra ("nvp", nameValuePairs); startActivity(intent); 
  • Array List Intent extra en Java
  • Android: lanzar aplicación desde el receptor de difusión
  • ¿Cómo manejar una intención que no tiene datos a primera llamada de una actividad?
  • Intención de elegir entre la cámara o la galería en Android
  • Pasando el archivo con intención, ¿cómo lo recupero?
  • Intent.EXTRA_EMAIL no rellena el campo Para
  • Cómo mostrar la actividad transparente en la otra actividad sin eliminar la actividad anterior
  • La actividad de los niños que se inició con la notificación no regresa a la navegación principal
  • ¿Cómo borrar los datos de intención en Actividad después de abrirlos desde url?
  • Comprobar si la aplicación está instalada - Android
  • Android: android.intent.action.BOOT_COMPLETED en ICS y Gingerbread
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.