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.
Si pasas una gran información de una a otra actividad, entonces puede ser que la aplicación sea más lenta
pero use Global Class para almacenar variables con el uso que pueda obtener o establecer fácilmente cualquier valor
eso declarado en el archivo Global
ver este enlace:
http://androidresearch.wordpress.com/2012/03/22/defining-global-variables-in-android/