studio programacion móviles desarrollo curso con aplicaciones java android android-activity android-4.0

java - programacion - Problema: pasar datos grandes a la segunda actividad



programacion android pdf 2018 (5)

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

  • No es necesario crear singletons, siempre tiene una instancia única de su enumeración;
  • Los datos están adecuadamente encapsulados;
  • La referencia se elimina 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 here .

Tengo un problema extraño. Estaba buscando por la web pero no encontré una respuesta. Todavía soy un principiante en la programación de 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 ejecutará 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 ustedes tuvo una idea ... ¡Gracias por su ayuda!

Editar: al menos lo olvidé: esto solo ocurre bajo ICS. La aplicación funciona como un encanto con gingerbread y froyo.

Edit2: 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


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


Por lo que recuerdo, hasta API-8 (Froyo), hubo algunas limitaciones (como 1MB) al pasar objetos a través de intenciones. Sin embargo, puede simplemente anotar los datos que se pueden empacar en un archivo y enviar la ruta del archivo a su siguiente actividad a través del paquete. Más tarde, codifique su segunda actividad para leer los datos del archivo y eliminarlos después.


Probablemente estés obteniendo TransactionTooLargeException

Según lo sugerido por google android guide , puede usar 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"

Desde su código, parece que eso es exactamente lo que necesita.

Entonces, su código en ActivitySearch.class podría verse más o menos así:

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

Luego 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 los usuarios, no es aconsejable utilizar campos estáticos, dado que el proceso de la aplicación podría ser cancelado y reiniciado por Android Framework mientras la aplicación se ejecuta en segundo plano (si el marco necesita liberar recursos). En tal caso, todos los campos estáticos se reiniciarán.