Problema: Pasar datos grandes a la segunda actividad

Tengo un problema extraño. Yo estaba buscando en la web, pero no encontré una respuesta. Todavía soy un principiante en la programación android. Entonces vamos:

Todo lo que quiero hacer es llamar a la segunda Actividad con algunos datos. Funciona bien con datos pequeños, pero si los datos son grandes, la segunda Actividad no se mostrará y la primera finalizará. Aquí está mi código del método de llamada:

Intent intent = new Intent(ActivitySearch.this,ActivityResults.class); Bundle bundle = new Bundle(); bundle.putParcelableArrayList("data", searchList); intent.putExtras(bundle); startActivity(intent); 

La parte de la recepción de datos no es importante. Incluso si no intento leer el paquete, no se llamará a la actividad. He probado esto con las siguientes líneas:

 @Override public void onCreate(Bundle savedInstanceState) { Log.d("DEBUG","ActivityResult::onCreate()"); super.onCreate(savedInstanceState); 

OnCreate() nunca se llama.

Tal vez uno de los suyos tiene una idea … Gracias por su ayuda!

Editar: al menos me olvidé: Esto sólo ocurre en ICS. La aplicación funciona como un encanto con pan de jengibre y froyo.

Editar2: Logcat

 10-10 14:49:46.951: D/OpenGLRenderer(21696): Flushing caches (mode 0) 10-10 14:49:47.011: V/ActivityThread(22429): com.example.amazonsearch white listed for hwui 10-10 14:49:50.821: W/IInputConnectionWrapper(21696): showStatusIcon on inactive InputConnection 

Probablemente obtenga TransactionTooLargeException

Como sugiere la guía de google android , puede utilizar campos estáticos o singletons para compartir datos entre actividades.

Lo recomiendan "Para compartir objetos complejos no persistentes definidos por el usuario de corta duración"

De su código parece que es exactamente lo que necesita.

Así que su código en ActivitySearch.class podría ser algo como esto:

 ActivityResults.data = searchList; Intent intent = new Intent(ActivitySearch.this,ActivityResults.class); startActivity(intent); 

A continuación, puede acceder a ActivityResults.data desde cualquier lugar en la actividad ActivityResults después de que se inicie.

Para los datos que deben compartirse entre las sesiones de usuario, no es recomendable utilizar campos estáticos, ya que el proceso de aplicación podría ser eliminado y reiniciado por android marco mientras la aplicación se ejecuta en segundo plano (si marco necesita liberar recursos). En tal caso todos los campos estáticos serán reinicializados.

La forma en que prefiero pasar datos grandes es mediante el uso de enums . Algunas ventajas de este enfoque:

  • No hay necesidad de crear singletons, siempre tienes instancia única de su enum;
  • Los datos están adecuadamente encapsulados;
  • La referencia se borra justo después de que la actividad la recibe

Aquí hay un ejemplo:

 package com.jyvee.arguments; import java.util.List; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; public class SomeActivity extends Activity { // Names for the arguments we pass to the // activity when we create it private final static String ARG_STRING = "ARG_STRING"; private final static String ARG_INT = "ARG_INT"; private String stringField; private int intField; private List<Object> arrayField; private enum DataHolder { INSTANCE; private List<Object> mObjectList; public static boolean hasData() { return INSTANCE.mObjectList != null; } public static void setData(final List<Object> objectList) { INSTANCE.mObjectList = objectList; } public static List<Object> getData() { final List<Object> retList = INSTANCE.mObjectList; INSTANCE.mObjectList = null; return retList; } } @Override protected void onCreate(final Bundle savedState) { super.onCreate(savedState); // Get the activity intent if there is a one final Intent intent = getIntent(); // And retrieve arguments if there are any if (intent.hasExtra(ARG_STRING)) { stringField = intent.getExtras().getString(ARG_STRING); } if (intent.hasExtra(ARG_INT)) { intField = intent.getExtras().getInt(ARG_INT); } // And we retrieve large data from enum if (DataHolder.hasData()) { arrayField = DataHolder.getData(); } // Now stringField, intField fields are available // within the class and can be accessed directly } /** * /** A static method for starting activity with supplied arguments * * @param contextA * context that starts this activity * @param stringArg * A string argument to pass to the new activity * @param intArg * An int argument to pass to the new activity * @param objectList * An object list argument to pass to the new activity */ public static void startActivity(final Context context, final String stringArg, final int intArg, final List<Object> objectList) { // Initialize a new intent final Intent intent = new Intent(context, SomeActivity.class); // To speed things up :) intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); // And add arguments to the Intent intent.putExtra(ARG_STRING, stringArg); intent.putExtra(ARG_INT, intArg); // Now we put the large data into our enum instead of using Intent extras DataHolder.setData(objectList); context.startActivity(intent); } } 

Más información aquí .

Si usted pasa una información grande de una a otra actividad entonces puede ser que haga App Slower

Pero utilizar la clase global para almacenar variables con el uso que puede fácilmente obtener o establecer cualquier valor

Que declaró en archivo global

Vea este enlace:

http://androidresearch.wordpress.com/2012/03/22/defining-global-variables-in-android/

Por lo que recuerdo, hasta API-8 (Froyo), había algunas limitaciones (como 1 MB) al pasar objetos parcelables a través de intentos. Sin embargo, puede simplemente escribir sus datos parcelables en un archivo y enviar la ruta del archivo a su siguiente actividad a través de un paquete. Después, codifique su segunda actividad para leer los datos del archivo y eliminarlos después.

No tengo ni idea de por qué no funciona con datos grandes, pero si no encuentra ninguna forma de solucionarlo, le sugiero que utilice una aplicación global personalizada, como aquí . (También compruebe la respuesta correcta para que funcione)

  • RxJava reintentoCuando vuelve a suscribir la propagación
  • ¿Castrará Android la tecnología Jazelle de ARM?
  • Medir el área de polígono irregular en android
  • Cómo solucionar el error de registro de Google Cloud Messaging: SERVICE_NOT_AVAILABLE?
  • Desconcertado por el valor de píxeles en Bitmap (pre multiplicado usando setPixel)
  • Enums y la anotación android intDef
  • Plugin de maven android con la biblioteca de soporte de android v7
  • Ejemplo androide del presentador de la versión / ejemplos del regulador
  • Tarea Simple de Reconocimiento de Imágenes en Android: Dominó Lectura
  • Android: ¿Cómo ejecutar asynctask de diferentes archivos de clase?
  • Nuevo hilo varias veces
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.