2016-07-17 77 views
1

Firebase docs他們說:與多進程和應用程序的onCreate避免碰撞

多個進程

崩潰報告創建一個單獨的後臺進程上傳崩潰 信息。如果您的應用程序擴展了Android應用程序類,則必須確保它是多進程安全的。否則,它可能會導致併發 問題。當應用程序擴展應用程序對象時,此對象將爲多進程應用程序中的每個進程實例化 。兩個重要 的看點是:

如果該對象的實現訪問任何超出進程狀態 (數據庫,文件系統,共享偏好等),或執行其他 行動不是爲了安全一個多進程環境,可能會出現併發問題 。這是因爲應用程序對象的多個實例可能同時運行。許多第三方庫 保持進程外狀態(例如在本地數據庫中),並且如果從 應用程序對象初始化,它們將受到 相同的併發問題影響。如果您的應用符合上述說明,並且您計劃在您的應用中使用崩潰報告,我們強烈建議您將 考慮將應用邏輯移至內容提供商或安卓活動 。任何對多進程環境不安全的應用程序邏輯都可能對您的應用程序產生意想不到的影響。

如何從我的Application類檢查是否孤單的ApplicationonCreate內的另一個實例,以避免與Fabric或他人崩潰?

+0

我認爲,如果您沒有在應用程序類的擴展中實例化Fabric或其他應用程序,那麼您不會遇到併發問題。 –

回答

3

一般而言,如果有另一個進程的另一個應用程序對象,則不會「查看」。您只需假定您的應用程序中每個進程總是隻有一個應用程序對象已創建,並且確保您可以安全地與其他進程中的其他應用程序對象一起運行。只是不要從應用程序訪問任何共享讀/寫資源,你會沒事的。

如果您只需從主進程初始化某些內容,則更可靠的方法是創建一個ContentProvider(在您的清單中聲明併爲其創建一個對象,像其他任何組件一樣),並使用它的onCreate() 。 ContentProviders只是在主進程中創建和初始化 - 而不是從其他進程中創建和初始化。這樣你就可以確定你的init不會在其他進程中被複制。

或者,如果您根本不想處理這個問題,只需等到崩潰報告從測試版發佈到完整版即可,因爲它在將來不會使用額外的進程。我們(谷歌)不能確切地說明這將是什麼時候,但我們並沒有浪費任何時間發佈完整版本。