Act*_*ine 6 multithreading android firebase
在我的设置中,Firebase 需要大约 250 毫秒进行初始化(在 Nexus 5 上测量,作为有和没有冷启动的“首次显示时间”的差异FirebaseInitProvider / CrashlyticsInitProvider)。这是一个问题,因为如果没有 Firebase,我的应用程序冷启动只需 350 毫秒,而 Firebase 会使这个时间增加一倍。
我正在考虑禁用默认的FirebaseInitProvider和CrashlyticsInitProvider,它在应用程序启动之前在主线程上运行,并在后台线程上手动进行初始化(例如从 启动它Application.onCreate())。
FirebaseApp.initializeApp()问:调用后台线程安全吗?如果是这样,我应该注意什么?我知道,如果需要,例如getUser()当 Firebase 仍在后台启动时,我必须实现一些锁定,以便我的线程等待它准备好。我也不关心准确的屏幕时间报告,因此如果 Firebase Analytics 延迟注册其活动生命周期回调,这不是问题。
PS 中有一个synchronized块FirebaseApp.initializeApp(),这意味着工程师假设有人会尝试从另一个线程调用它。我更担心内部结构,这些内部结构没有开源可供检查。
PPS 另外,我的应用程序是一个单进程应用程序,所以它不太可能Application.onStart()被多次调用(除非我在这里遗漏了一些东西)。
小智 0
来自https://firebase.googleblog.com/2017/03/take-control-of-your-firebase-init-on.html
您可以从项目中的 google-services.json 获取初始化信息,或者在 firebase init 中设置断点并查看上下文中的内容。
在清单中禁用自动初始化...
<provider
android:name="com.google.firebase.provider.FirebaseInitProvider"
android:authorities="${applicationId}.firebaseinitprovider"
tools:node="remove"
/>
Run Code Online (Sandbox Code Playgroud)
如果您没有将“tools”命名空间添加到清单根标记中,则还必须添加它:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="your.package"
>
Run Code Online (Sandbox Code Playgroud)
像这样在代码中显式初始化...可以从这里的后台线程调用...
FirebaseOptions.Builder builder = new FirebaseOptions.Builder()
.setApplicationId("1:0123456789012:android:0123456789abcdef")
.setApiKey("your_api_key")
.setDatabaseUrl("https://your-app.firebaseio.com")
.setStorageBucket("your-app.appspot.com");
FirebaseApp.initializeApp(this, builder.build());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
994 次 |
| 最近记录: |