La forma correcta de instanciar e inicializar objetos en android
Tengo varios paquetes en mi proyecto de android que contiene un número de clases. Cuando quiero crear un objeto de una determinada clase en una actividad de interfaz de usuario, había utilizado un método de creación de un objeto privado e inicializarlo antes del método onCreate()
donde las actividades de interfaz de usuario se encuentran en un paquete independiente.
private SomeClass someClass = new SomeClass(); onCreate(Bundle savedInstanceState) { // Activity }
He notado mis programadores mayores utilizan otro método tal que declaran el objeto antes de onCreate()
y lo inicializan cuando el objeto es necesario. ¿Cuál es la diferencia y me sugieren la mejor manera? Quiero corregir si estoy haciendo algo mal aquí.
- Public onCreate (), o onCreate protegido ()?
- Diferencia y usos de onCreate (), onCreateView () y onActivityCreated () en fragmentos
- Puntero nulo Excepción - findViewById ()
- Diferencia entre onCreate () y onStart ()?
- El servicio onCreate de Android se llama varias veces sin llamar a onDestroy
- Get activityInfo metaData en el método onCreate
- Android - Constructor de actividad vs onCreate
- Fragmento de Android OnCreateView llamado dos veces
- Android: Dejar de recrear la actividad en el cambio de orientación
- Obtención de MenuItem en onCreate
- ¿Por qué se debe llamar OnCreate sólo una vez al inicio de la Actividad?
- Android: ¿Cuándo se llama onCreateOptionsMenu durante el ciclo de vida de la actividad?
- La aplicación se bloquea después de recibir una llamada telefónica
Normalmente prefiero el segundo enfoque porque el objeto se creará sólo cuando sea necesario. En el primer enfoque está creando un objeto singleton. El objeto toma memoria incluso antes cuando es necesario. Algunas situaciones que prefiero el segundo enfoque son:
- Si el mismo objeto será utilizado de diferentes partes de la actividad. Por lo tanto, no desea comprobar la nula cada vez antes de usar quiere un código limpio y desea un código más limpio.
- Si habrá un solo objeto común para la clase que no cambiará a través de. Por lo general, lo hacen estático. Un buen ejemplo es:
String LOG_TAG = MyActivity.class.getSimpleName();
- Si el objeto se utilizará con frecuencia en su actividad. Para la actividad que hace la comunicación frecuente con el servidor, por ejemplo, usted debe crear el objeto de la clase que hace la comunicación de esta manera. Otro ejemplo es
Si el objeto se utilizará en ciertas partes de la clase, debería considerar declararla dentro de esa clase.
Por alguna razón me gusta quedarme con el primer enfoque para las variables de nivel de clase. Esto me ahorra el problema de tratar con nullpointerexception si el objeto de la clase no ha sido inicializado. Quédate con el primero. Por ejemplo, vamos a tomar la clase String:
String mystring; //in some functions deep inside code mystring = "hello world";//works great with string
Pero vamos a tomar un ejemplo de búfer de cadena similar:
StringBuffer mystring; //in some functions deep inside code mystring.append("hello world");
En el segundo ejemplo me olvidé mystring = new StringBuffer (); Por lo tanto, el .append dará la excepción nullpointer y el editor es generalmente clueless. Esto sucede mucho de lo que usted espera. Lo mismo ocurre con arrayList y otros.
A primera vista, diría que si declara la variable / objeto dentro de onCreate, sólo lo tendrá disponible en ese método. (Variables de ámbito local)
Creando la variable fuera e inicializando la variable / objeto dentro del primer método que se ejecuta (onCreate) tendrás una variable de toda la clase que puedes usar donde quiera que esté en la clase, ten cuidado de proteger el acceso a ella con if(var != null)
para evitar NullPointeException. (Gloabal variables de alcance)
Yo personalmente no prefiero ninguno de los dos, sólo lo uso correctamente para cada caso, debido a que el segundo caso retiene la memoria por un tiempo más largo, y que es innecesario si se utiliza esa var en un ámbito local sólo
Por ejemplo, si necesita un MediaPlayer que se reproduce al inicio de una actividad y se detiene al salir, es mejor que lo declare globalmente, para inicializarlo en onCreate, hacer que funcione en onResume, hacer que se detenga en onStop y Lanzarlo en onDestroy, así que:
-
Sólo se inicializa el MediaPleyr una vez (onCreate)
-
Cada vez que vuelve a entrar en la actividad (onResume), MediaPlayer se inicia y no necesita ser inicializado
-
Al salir de la actividad, el MediaPlayer se detiene (onPause)
-
Cuando la actividad ya no necesita la memoria se libera, por lo que no "IllegalState" excepciones o fugas de objetos (onDestroy)
* Usted también podría hacer todo eso con un montón de oyentes (onPreparedListener, onCompletionListener, …), pero esto es sólo otra manera, y tienen un comportamiento ligeramente diferente
- Android Studio, ¿utiliza herramientas de SDK?
- Android: inserta una matriz de imágenes de mapa de bits en la base de datos SQLite