studio patron example context activity android singleton

example - patron singleton android



Singleton en Android (8)

He seguido este enlace y realicé 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 si tuviera la Actividad A y la Actividad B. En la Actividad AI acceda al objeto desde la class Singleton. Uso el objeto y le hice algunos cambios.

Cuando me muevo a la Actividad B y accedo al objeto de Singleton Class, me dio el objeto inicializado y no guarda los cambios que hice en la Actividad A. ¿Hay alguna otra forma de guardar el cambio? Por favor, ayúdame Expertos. Esta es la 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); }

}

Esto 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, recibo Hello que he inicializado en Singleton luego World, que le di en MainActivity y de nuevo muestra Hello en NextActivity en logcat. Quiero que muestre mundo nuevamente en NextActivity . Por favor, ayúdame a corregir esto.


Como @Lazy declaró en esta respuesta , puede crear un singleton a partir de una plantilla en Android Studio. Vale la pena señalar que no es necesario verificar 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 siguiente código:

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


Es simple, como un Java, Android también es compatible con Singleton. -

Singleton es parte del patrón de diseño de Gang of Four y se clasifica en patrones de diseño creacional.

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

-> Constructor privado: Esto evitará que nadie más cree una instancia de la clase Singleton.

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

  1. crear instancia privada
  2. crear un 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 usa singleton -

Logger.getInstance();


Está copiando el customVar de customVar en una variable singletonVar y cambiar esa variable no afecta el 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;


La forma más limpia y moderna de usar singletons en Android es usar el marco de Dependency Injection llamado Dagger 2 . Here tiene una explicación de los posibles ámbitos que puede usar. Singleton es uno de estos ámbitos. La Inyección de Dependencia no es tan fácil, pero deberá invertir un poco de su tiempo para comprenderla. También hace que las pruebas sean más fáciles.


La respuesta sugerida por Rakesh es genial, pero aún con algunas descripciones. Singleton en Android es lo mismo que Singleton en Java: el patrón de diseño de Singleton aborda todas estas inquietudes. Con el patrón de diseño de Singleton, puede:

1) Asegúrese de que solo se cree una instancia de una clase

2) Proporcionar un punto de acceso global al objeto

3) Permitir varias 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; } }


Puse mi versión de Singleton a continuación:

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 llamarse en la clase principal (Splash) y el método getInstance podría llamarse desde otras clases. Esto solucionará el problema cuando la clase de llamante requiera el singleton pero no tiene el contexto.

Finalmente, el método hasBeenInitialized se usa para verificar si la clase se ha inicializado. Esto evitará que diferentes instancias tengan diferentes contextos.


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

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


EDITAR:

La implementación de Singleton en Android no es segura y debe 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ápido:

MyActivity: configure el singleton por primera vez + inicialice el atributo mString ("Hello") en el constructor privado y muestre el valor ("Hello")

Establezca un nuevo valor en mString: "Singleton"

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