Как обрабатывать экземпляр Remote Config внутри синглтона - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь сделать выборку Remote Config для загрузки его в первый раз на моем SplashScreen.

Во время загрузки моего заставки я получаю данные с помощью пульта дистанционного управления.Конфигурация синглтона один раз, а затем я просто получаю доступ к значению внутри каждого класса, в котором мне нужно значение этого Remote Config

Я делаю это, чтобы пользователи не могли видеть изменения, пока они находятся в Activity,это из-за рождественской темы, которую я создаю, чтобы показать пользовательский макет с удаленной конфигурацией

Все работает нормально (иногда), и тема меняется во всем приложении с этим синглтоном, но естьиногда время асинхронной выборки, которое должно пройти, возвращается после загрузки моего SplashScreen, поэтому я могу видеть, что тема изменилась в остальных моих действиях, но не в основной после SplashScreen

Это мой синглтон

public class PruebaSingleton {

    private boolean christmasEvent;
    private FirebaseRemoteConfig mFirebaseRemoteConfig;
    private static volatile PruebaSingleton _instance;

 private PruebaSingleton(){
        fetchRemoteConfig();
    }

    public synchronized static PruebaSingleton getInstance(){
        if(_instance == null){

            synchronized (PruebaSingleton.class) {
                if (_instance == null) _instance = new PruebaSingleton();
            }
        }

        return  _instance;
    }

    private void fetchRemoteConfig() {
        mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
        mFirebaseRemoteConfig.setConfigSettings(
                new FirebaseRemoteConfigSettings.Builder().setDeveloperModeEnabled(BuildConfig.DEBUG)
                        .build());

        mFirebaseRemoteConfig.fetch(0).addOnCompleteListener(task -> {
            if (task.isSuccessful()) {

                 mFirebaseRemoteConfig.activateFetched();

            }

            christmasEvent = mFirebaseRemoteConfig.getBoolean("christmas_ottaa_mode");

        }).addOnFailureListener(e -> {

        });
    }
    public boolean isChristmasModeEnabled(){
        return christmasEvent;
    }

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

На моем SplashScreen onCreate()

PruebaSingleton.getInstance();

И тогда я просто получаю логическое значение во всех моих действиях таким образом

PruebaSingleton.getInstance().isChristmasModeEnabled();

Изатем я могу сменить тему.

Дело в том, что иногда (не обычно, но это происходило примерно 2 раза за 10 запусков) выборка из синглтона внутри моего SplashScreen получает данные после заставкиотправляет на первое задание, это приводит к тому, что мое первое задание не отображает тему, но мои другие задания отображают.

У меня вопрос

Есть ли способ обработать выборку, пока я в моемЗаставка ?

Мысль о создании интерфейса немного замедлит мой SplashScreen, пока вся работа по извлечению не будет выполнена в классе singleton, но я также не хочу показывать всплывающее диалоговое окно в первом действии, чтобы сообщить пользователям, которые ожидаютдля извлечения.

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

Кроме того, первый выбор должен работать правильно, второй запуск загрузит данные, которые были получены в первый раз, а затем будет ждать 12 часов, чтобы запросить новые данные,поэтому мне нужно, чтобы в первый раз все действия со значением выборки были в значении true.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Я решил проблему с помощью простого обратного вызова, как говорит Даг, вот что я сделал и как это работает

Сначала я создал интерфейс, который будет вызывать, когда значение true или ложь при извлеченииделается

public interface SingletonListener {

    void onRemoteFetch(boolean isFetched);
}

Затем в моем синглтоне я просто заполняю значение интерфейса, когда знаю, что он получен, если возникает ошибка, я просто устанавливаю его в false

 mFirebaseRemoteConfig.fetch(0).addOnCompleteListener(task -> {
            if (task.isSuccessful()) {

                mFirebaseRemoteConfig.activateFetched();

            }

            christmasEvent = mFirebaseRemoteConfig.getBoolean("christmas_ottaa_mode");
            mSingletonListener.onRemoteFetch(christmasEvent);
        }).addOnFailureListener(e -> {

            mSingletonListener.onRemoteFetch(false);

        });



   //Setters and getters, so in Splash, when I know its fetched I just set the value to the Singleton and then just get it everywhere in the app

 public boolean isChristmasMode() {
            return christmasMode;
        }

        public void setChristmasMode(boolean christmasMode) {
            this.christmasMode = christmasMode;
        }

инабор реализации этого интерфейса

public void setInterfaz(SingletonListener listener){
        this.mSingletonListener = listener;
    }

Тогда в моем SplashScreen я просто жду, пока это значение не будет выбрано, чтобы перейти на панель инструментов, так как это экран загрузки, я не особо беспокоюсь об ожидании 1 или 2больше секунд

Инициируйте синглтон и присоедините интерфейс

RemoteConfigSingleton.getInstance().setInterfaz(this);

, затем внедрите метод и дождитесь, пока результат получит доступ к приборной панели

 @Override
    public void onRemoteFetch(boolean isFetched) {
        accessDashboard();
        RemoteConfigSingleton.getInstance().setChristmasMode(isFetched);
    }

Поскольку я неМеня не интересует значение выборки, истинное или ложное. Я получаю доступ к панели мониторинга сразу после того, как узнаю, что данные были получены, если они выполнены или произошла ошибка

Затем, например, в любой Деятельности, в которой мне нужно изменить тему чего-то, я просто называю логическое значение, возвращаемое christmasEvent, теперь, когда я знаю, что оно имеет какое-то значение

        if(RemoteConfigSingleton.getInstance().isChristmasMode()){
            toolbar.setBackgroundResource(R.color.christmas);
            Christmas stuff...
        }
    }
0 голосов
/ 06 декабря 2018

Ваш синглтон должен предоставить способ, позволяющий некоторому другому коду присоединять слушателя, чтобы он знал, когда выборка завершена, подобно тому, как вы присоединяете слушателя к Задаче, которая выполняет выборку.Или вы можете просто выставить само задание.

Задание, на которое я ссылаюсь, возвращается так:

mFirebaseRemoteConfig.fetch(0)
...