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:
- Cómo hacer Java Thread Dump en Android?
- Parse Exception: En la línea 1, columna 0: no se encontró ningún elemento
- Enum VS Static Class (Normal y con valores de cadena)
- Cómo utilizar TextInputLayout con Theme.material?
- Apache HTTPClient 4.x vs HttpUrlConnection - ¿cuál es más rápido en Android?
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
- ¿Cuál es la mejor manera de soportar apis de Google Maps (v1 y v2)?
- ¿Cómo suprimir la advertencia de Gradle en Android Studio?
- ¿Cómo puede obtener la dirección de correo electrónico de un usuario de Android?
- Excepción de JsonReader en Android mientras se analizan datos JSON grandes
- Error al ejecutar sbt install-emulator
- NullPointerException: Intenta invocar el método virtual 'boolean java.lang.String.equalsIgnoreCase (java.lang.String)' en una referencia de objeto nulo
- Cómo puedo pasar el parámetro múltiple a reparador webservice usando el poste del HTTP
- Ninguna faceta de Android encontrada en el módulo
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)