Подтвердить что ты не робот

Синглтон в Android

Я перешел по этой ссылке и успешно сделал синглтон-класс в Android. http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/

Проблема в том, что я хочу один объект. как у меня есть Деятельность A и Деятельность B. В Activity AI получить доступ к объекту из class Singleton. Я использую объект и внес в него некоторые изменения.

Когда я перехожу к действию B и получаю доступ к объекту из класса Singleton, он дает мне инициализированный объект и не сохраняет изменений, которые я сделал в действии A. Есть ли другой способ сохранить изменения? Пожалуйста, помогите мне эксперты. Это 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);
    }

}

Это 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);
        }
  }

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
     }
 }

и 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
    }
}

Когда я запускаю этот код, я получаю Hello, который я инициализировал в Singleton затем World, который я дал ему в MainActivity и снова показывает Hello в NextActivity в logcat. Я хочу, чтобы он снова показал мир в NextActivity. Пожалуйста, помогите мне исправить это.

4b9b3361

Ответ 1

РЕДАКТИРОВАТЬ :

Реализация Singleton в Android не является "безопасной" (см. Здесь), и вы должны использовать библиотеку, посвященную этому типу паттернов, такую как Dagger или другую библиотеку DI, для управления жизненным циклом и внедрением.


Не могли бы вы опубликовать пример из своего кода?

Взгляните на эту суть: https://gist.github.com/Akayh/5566992

это работает, но это было сделано очень быстро:

MyActivity: установить синглтон в первый раз + инициализировать атрибут mString ("Hello") в приватном конструкторе и показать значение ("Hello")

Установите новое значение в mString: "Singleton"

Запустите ActivityB и покажите значение mString. "Синглтон" появляется...

Ответ 2

Совет.. Чтобы создать класс singleton. В Android Studio щелкните правой кнопкой мыши в своем проекте и откройте меню:

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

введите описание изображения здесь

Ответ 3

Это просто, как Java, Android также поддерживает singleton. -

Синглтон является частью шаблона проектирования Gang of Four и классифицируется по шаблонам дизайна.

- > Статический член: содержит экземпляр класса singleton.

- > Частный конструктор: это не позволит кому-либо еще создать экземпляр класса Singleton.

- > Статический общедоступный метод: предоставляет глобальную точку доступа к объекту Singleton и возвращает экземпляр вызывающему классу клиента.

  • создать частный экземпляр
  • создать частный конструктор
  • использовать getInstance() класса Singleton

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

при использовании singleton -

Logger.getInstance();

Ответ 4

Ответ, предложенный rakesh, замечательный, но все же с некоторым описанием Синглтон в Android такой же, как Singleton в Java: Шаблон проектирования Singleton учитывает все эти проблемы. С шаблоном проектирования Singleton вы можете:

1) Убедитесь, что создан только один экземпляр класса

2) Обеспечить глобальную точку доступа к объекту

3) Разрешить несколько экземпляров в будущем, не затрагивая клиенты класса singleton

Основной пример класса Singleton:

public class MySingleton
{
    private static MySingleton _instance;

    private MySingleton()
    {

    }

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

Ответ 5

Как сказал @Lazy в этом ответе, вы можете создать синглтон из шаблона в Android Studio. Стоит отметить, что нет необходимости проверять, является ли экземпляр нулевым, поскольку сначала инициализируется статическая переменная ourInstance. В результате реализация singleton-класса, созданная Android Studio, прост, как следующий код:

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

    public static MySingleton getInstance() {
        return ourInstance;
    }

    private MySingleton() {
    }
}

Ответ 6

Вы копируете singleton customVar в переменную singletonVar, и изменение этой переменной не влияет на исходное значение в 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;

Ответ 7

Я поставил свою версию Singleton ниже:

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.");
    }
}

Обратите внимание, что инициализация метода может быть вызвана в основном классе (Splash), и метод getInstance может быть вызван из других классов. Это устранит проблему, если класс вызывающего требует одноэлемент, но он не имеет контекста.

Наконец, метод hasBeenInitialized используется для проверки того, был ли класс инициализирован. Это позволит избежать того, что разные экземпляры имеют разные контексты.

Ответ 8

Самый чистый и современный способ использования синглтонов в Android - это использовать инфраструктуру подстановки зависимостей под названием Кинжал 2. Здесь у вас есть объяснение возможных областей, которые вы можете использовать. Синглтон - одна из этих областей. Зависимость Инъекции не так просто, но вы должны потратить немного времени, чтобы понять это. Это также облегчает тестирование.