Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Singleton en Android

He seguido este enlace y he realizado con éxito la clase singleton en Android. Http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/

El problema es que quiero un solo objeto. Como tengo Actividad A y Actividad B. En Actividad AI accedo al objeto desde la class Singleton. Utilizo el objeto y le hice algunos cambios.

Cuando me muevo a la Actividad B y accedo al objeto desde Singleton Class me dio el objeto inicializado y no guarda los cambios que he hecho en la Actividad A. ¿Hay alguna otra manera de guardar el cambio? Por favor, ayúdame a los expertos. Esta es MainActivity

 public class MainActivity extends Activity { protected MyApplication app; private OnClickListener btn2=new OnClickListener() { @Override public void onClick(View arg0) { Intent intent=new Intent(MainActivity.this,NextActivity.class); startActivity(intent); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Get the application instance app = (MyApplication)getApplication(); // Call a custom application method app.customAppMethod(); // Call a custom method in MySingleton Singleton.getInstance().customSingletonMethod(); Singleton.getInstance(); // Read the value of a variable in MySingleton String singletonVar = Singleton.customVar; Log.d("Test",singletonVar); singletonVar="World"; Log.d("Test",singletonVar); Button btn=(Button)findViewById(R.id.button1); btn.setOnClickListener(btn2); } 

}

Esta es NextActivity

 public class NextActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_next); String singletonVar = Singleton.customVar; Log.d("Test",singletonVar); }} 

Clase Singleton

 public class Singleton { private static Singleton instance; public static String customVar="Hello"; public static void initInstance() { if (instance == null) { // Create the instance instance = new Singleton(); } } public static Singleton getInstance() { // Return the instance return instance; } private Singleton() { // Constructor hidden because this is a singleton } public void customSingletonMethod() { // Custom method } } 

Y MyApplication

 public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); // Initialize the singletons so their instances // are bound to the application process. initSingletons(); } protected void initSingletons() { // Initialize the instance of MySingleton Singleton.initInstance(); } public void customAppMethod() { // Custom application method } } 

Cuando ejecuto este código, obtengo Hola que he inicializado en Singleton entonces Mundo que le di en MainActivity y muestra de nuevo Hello en NextActivity en logcat. Quiero que muestre el mundo nuevamente en NextActivity . Por favor ayúdeme a corregir esto.

  • Picasso Singleton Uso
  • ¿Es seguro guardar una referencia a un hilo en un singleton?
  • Actividad de Android singleton
  • ¿Puedo obtener cierta eficiencia al declarar a los miembros apropiados "estáticos" en la actividad de Android?
  • Acceso al objeto GoogleApiClient en Todas las actividades
  • Obtenga el contexto de aplicación de la clase singleton de no actividad
  • ¿Cuál es la diferencia entre "nuevo A ()" y "A.newInstance ()"?
  • El servicio de Android no funciona como singleton
  • 8 Solutions collect form web for “Singleton en Android”

    EDIT:

    La implementación de Singleton en Android no es segura y deberías usar una biblioteca dedicada a este tipo de patrón como Dagger u otra biblioteca DI para administrar el ciclo de vida y la inyección.


    ¿Podría publicar un ejemplo de su código?

    Echa un vistazo a esta esencia: https://gist.github.com/Akayh/5566992

    Funciona, pero se hizo muy rápidamente:

    MyActivity: establece el singleton por primera vez + inicializa el atributo mString ("Hello") en el constructor privado y muestra el valor ("Hello")

    Establecer nuevo valor en mString: "Singleton"

    Inicie activityB y muestre el valor mString. "Singleton" aparece …

    Sugerencia: Para crear una clase singleton En Android Studio, haga clic con el botón derecho del ratón en su proyecto y abra el menú:

     New -> Java Class -> Choose Singleton from dropdown menu 

    Introduzca aquí la descripción de la imagen

    Es simple, como un java, Android también apoyando singleton. –

    Singleton es una parte del patrón de diseño de la cuadrilla de cuatro y se categoriza debajo de patrones de diseño creational.

    -> Miembro estático: contiene la instancia de la clase singleton.

    -> Constructor privado: Esto evitará que otros instancien la clase Singleton.

    -> Método público estático: proporciona el punto global de acceso al objeto Singleton y devuelve la instancia a la clase de llamada cliente.

    1. Crear una instancia privada
    2. Crear constructor privado
    3. Use getInstance () de la clase Singleton

       public class Logger{ private static Logger objLogger; private Logger(){ //ToDo here } public static Logger getInstance() { if (objLogger == null) { objLogger = new Logger(); } return objLogger; } } 

    Mientras que el uso singleton –

     Logger.getInstance(); 

    Respuesta sugerida por rakesh es grande, pero aún con algunos discripción Singleton en Android es el mismo que Singleton en Java: El patrón de diseño Singleton aborda todas estas preocupaciones. Con el patrón de diseño Singleton puede:

    1) Asegúrese de que sólo se crea una instancia de una clase

    2) Proporcionar un punto de acceso global al objeto

    3) Permitir múltiples instancias en el futuro sin afectar a los clientes de una clase singleton

    Un ejemplo básico de clase Singleton:

     public class MySingleton { private static MySingleton _instance; private MySingleton() { } public static MySingleton getInstance() { if (_instance == null) { _instance = new MySingleton(); } return _instance; } } 

    Como dijo @Lazy en esta respuesta , puede crear un singleton a partir de una plantilla en Android Studio. Vale la pena señalar que no hay necesidad de comprobar si la instancia es nula porque la variable static ourInstance se inicializa primero. Como resultado, la implementación de clase singleton creada por Android Studio es tan simple como el código siguiente:

     public class MySingleton { private static MySingleton ourInstance = new MySingleton(); public static MySingleton getInstance() { return ourInstance; } private MySingleton() { } } 

    Está copiando customVar de singleton en una variable singletonVar y cambiar esa variable no afecta al valor original en singleton.

     // This does not update singleton variable // It just assigns value of your local variable Log.d("Test",singletonVar); singletonVar="World"; Log.d("Test",singletonVar); // This actually assigns value of variable in singleton Singleton.customVar = singletonVar; 

    Puse mi versión de Singleton abajo:

     public class SingletonDemo { private static SingletonDemo instance = null; private static Context context; /** * To initialize the class. It must be called before call the method getInstance() * @param ctx The Context used */ public static void initialize(Context ctx) { context = ctx; } /** * Check if the class has been initialized * @return true if the class has been initialized * false Otherwise */ public static boolean hasBeenInitialized() { return context != null; } /** * The private constructor. Here you can use the context to initialize your variables. */ private SingletonDemo() { // Use context to initialize the variables. } /** * The main method used to get the instance */ public static synchronized SingletonDemo getInstance() { if (context == null) { throw new IllegalArgumentException("Impossible to get the instance. This class must be initialized before"); } if (instance == null) { instance = new SingletonDemo(); } return instance; } @Override protected Object clone() throws CloneNotSupportedException { throw new CloneNotSupportedException("Clone is not allowed."); } } 

    Tenga en cuenta que el método initialize podría ser llamado en la clase principal (Splash) y el método getInstance podría ser llamado desde otras clases. Esto solucionará el problema cuando la clase que llama requiere el singleton pero no tiene el contexto.

    Finalmente, el método hasBeenInitialized sirve para comprobar si la clase ha sido inicializada. Esto evitará que diferentes instancias tengan diferentes contextos.

    La manera más limpia y moderna de usar singletons en Android es usar el marco de Inyección de Dependencia llamado Dagger 2 . Aquí tiene una explicación de los posibles ámbitos que puede utilizar. Singleton es uno de estos ámbitos. La inyección de dependencia no es tan fácil, pero usted invertirá un poco de su tiempo para entenderlo. También facilita las pruebas.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.