12

是否可以懶惰地初始化織物套件?例如,現在我做: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()); 
    } 

回答

0

邁克從面料這裏。目前,我們只尊重Fabric的第一次初始化。一種選擇是預先初始化所有內容,或者如果你可以忽略一些崩潰,那麼不要在你的應用程序的代碼中稍後初始化Twitter和Crashlytics。

+0

感謝您的回答!不幸的是沒有那些理想。我們有沒有機會至少讓Twitter初始化更快?我不知道它在做什麼,但是在450毫秒(在Galaxy S7上),這非常密集。 – zrgiu

+0

由於Fabric已被Google收購,對於任何緩慢的初始時間,我都建議在https://twittercommunity.com/c/publisher上發帖,因爲Twitter團隊會監視SDK上的任何問題。 –

3

您可以使用生成器模式的初始化,可以在調試模式禁用崩潰報告:

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

更新1:添加更多的套件之後或延遲初始化織物套裝?:

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); 
+0

那個名爲* crashlytics *的第二個參數是以這種方式構建的。無論哪種方式 - 這並不重要,因爲即使以您的示例爲例,它也不是很明顯:您以後如何初始化並將其他套件添加到Fabric中? – zrgiu

+0

關於你的編輯的評論:如果你嘗試,你會發現它並不實際工作。如果嘗試添加它,fabric.getKits()將返回一個引發異常的集合。 – zrgiu

+0

我根據所公開的邏輯或API更新了我的答案。截至目前,我還沒有使用Twitter。但如果它是一個例外,那麼我很抱歉。我依賴於Fabric API和邏輯,並且正如預期的那樣,它應該工作,因爲它返回的內容非常常見,或者它應該在編譯時指示警告。挖掘後,我會嘗試提出一個錯誤。 –