Ленивая инициализация наборов Fabric?

Можно ли лениво инициализировать наборы тканей? например, прямо сейчас я делаю:

Fabric.with(this, crashlytics, twitterCore, tweetUi); // 500ms

Я хотел бы инициализировать только Crashlytics (без материалов для твиттера), как показано ниже, потому что это в 10 раз быстрее, и мне не нужны материалы для Twitter прямо сейчас.

Fabric.with(this, crashlytics); // 50ms

Позже, когда пользователь посещает действие, где мне нужны TwitterCore и TweetUi, я хотел бы добавить их в Fabric на лету, прежде чем использовать.

Это возможно ?

Редактировать: Мне удалось сделать это с отражением, что, очевидно, не идеально, но пока работает. Я все еще ищу правильное решение для этого. Вот как я это сделал:

    try {
        final Fabric newFabric = (new Fabric.Builder(context)).kits(crashlytics, twitterCore, tweetUi).build();
        final Method method = Fabric.class.getDeclaredMethod("setFabric", Fabric.class);
        method.setAccessible(true);
        method.invoke(null, newFabric);
    } catch (Exception e) {
        Timber.e(e, e.getMessage());
    }

person zrgiu    schedule 07.04.2017    source источник


Ответы (2)


Майк из Fabric здесь. В настоящее время мы учитываем только первую инициализацию Fabric. Одним из вариантов было бы инициализировать все заранее или, если вы не против пропустить некоторые сбои, не инициализировать Twitter и Crashlytics до тех пор, пока код вашего приложения не появится.

person Mike Bonnell    schedule 13.04.2017
comment
Спасибо за ответы! К сожалению, ни один из них не идеален. Есть ли шанс, что мы хотя бы ускорим инициализацию Twitter? Я не знаю, что он делает, но при 450 мс (на Galaxy S7) это довольно интенсивно. - person zrgiu; 13.04.2017
comment
Поскольку Fabric была приобретена Google, я бы порекомендовал размещать сообщения на странице twittercommunity.com/c/ в случае медленного запуска. издатель, так как команда Twitter отслеживает любые вопросы по его SDK. - person Mike Bonnell; 13.04.2017

Вы можете использовать шаблон построителя для инициализации и можете отключить отчеты о сбоях в режиме отладки:

CrashlyticsCore core =
    new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build();
Fabric.with(this, new Crashlytics.Builder().core(core).build(), new Crashlytics());

Обновление 1: добавление дополнительных комплектов впоследствии или отложенная инициализация комплектов Fabric?:

CrashlyticsCore core =
    new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build();
//Store the below fabric as an instance member
Fabric fabric = Fabric.with(this, new Crashlytics.Builder().core(core).build(), new Crashlytics
    ());
//To add later:
fabric.getKits().add(YOUR_NEW_KIT);
person Anurag Singh    schedule 11.04.2017
comment
второй параметр, названный crashlytics, был создан таким образом. В любом случае - это не имеет большого значения, потому что даже с вашим примером это не очевидно: как вы инициализируете и добавляете другие наборы в Fabric позже? - person zrgiu; 11.04.2017
comment
комментарий относительно вашего редактирования: если вы попробуете это, вы увидите, что на самом деле это не работает. Fabric.getKits() возвращает коллекцию, которая выдает исключение, если вы пытаетесь что-то добавить. - person zrgiu; 12.04.2017
comment
Я обновил свой ответ на основе логики или раскрытого API. Я пока не пользуюсь Твиттером. Но если это исключение, то извините. Я полагался на API и логику Fabric, и, как и ожидалось, он должен работать, поскольку он очень часто возвращает то, что он возвращает, или он должен был указать предупреждение во время компиляции или около того. Я попытаюсь поднять ошибку после того, как покопаюсь в ней. - person Anurag Singh; 12.04.2017