到目前为止我做了什么...
我在用Tasks.await
blocking https://developers.google.com/android/guides/tasks#blocking工作线程中的 firebase 调用机制以避免回调。
我正在使用工作线程(JobIntentService)进行一些初始化进程。 JobIntentService 在应用程序打开时启动,并且仅运行一次。下面是我的工作线程代码
if (isDeviceConnectedToInternet()) {
Tasks.await(FirebaseConfigHelper.getRemoteConfig().fetchAndActivate()); //error here
initFirebaseConfigVariables();
// other codes
}
//FirebaseConfigHelper.java
public static FirebaseRemoteConfig getRemoteConfig() {
FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
mFirebaseRemoteConfig.setDefaultsAsync(R.xml.remote_config_defaults);
return mFirebaseRemoteConfig;
}
我在用
implementation 'com.google.firebase:firebase-config:19.0.4'
关于错误
它在测试设备中运行良好。我在另外 15 台设备上进行了测试Firebase 测试实验室 https://firebase.google.com/docs/test-lab。根本没有任何问题。但是当我发布到生产环境时,这个错误发生在一些特定的 Mi 和 Samsung 设备上。
错误日志
我只能得到这个日志,因为生产中发生错误
java.util.concurrent.ExecutionException:
com.google.firebase.remoteconfig.FirebaseRemoteConfigClientException:
The client had an error while calling the backend! at
com.google.android.gms.tasks.Tasks.zzb(Unknown Source:61) at
com.google.android.gms.tasks.Tasks.await(Unknown Source:23) at
com.maju.myapp.service.SyncWithFirebaseJobIntentService.syncWithFirebaseConfig(SyncWithFirebaseJobIntentService.java:207) at
com.maju.myapp.service.SyncWithFirebaseJobIntentService.onHandleWork(SyncWithFirebaseJobIntentService.java:55) at
androidx.core.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:392) at
androidx.core.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:383) at
android.os.AsyncTask$3.call(AsyncTask.java:378) at
java.util.concurrent.FutureTask.run(FutureTask.java:266) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at
java.lang.Thread.run(Thread.java:919)Caused by:
com.google.firebase.remoteconfig.FirebaseRemoteConfigClientException:
The client had an error while calling the backend! at
com.google.firebase.remoteconfig.internal.ConfigFetchHttpClient.fetch(com.google.firebase:firebase-config@@19.0.4:194) at
com.google.firebase.remoteconfig.internal.ConfigFetchHandler.fetchFromBackend(com.google.firebase:firebase-config@@19.0.4:278) at
com.google.firebase.remoteconfig.internal.ConfigFetchHandler.fetchFromBackendAndCacheResponse(com.google.firebase:firebase-config@@19.0.4:251) at
com.google.firebase.remoteconfig.internal.ConfigFetchHandler.fetchIfCacheExpiredAndNotThrottled(com.google.firebase:firebase-config@@19.0.4:191) at
com.google.firebase.remoteconfig.internal.ConfigFetchHandler.lambda$fetch$0(com.google.firebase:firebase-config@@19.0.4:160) at
com.google.firebase.remoteconfig.internal.ConfigFetchHandler$$Lambda$1.then(Unknown
Source:4) at com.google.android.gms.tasks.zzf.run(Unknown
Source:2) ... 3 moreCaused by: java.net.ConnectException: Failed to
connect to
firebaseremoteconfig.googleapis.com/2404:6800:4007:809::200a:443 at
com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:147) at
com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116) at
com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186) at
com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128) at
com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97) at
com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289) at
com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232) at
com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465) at
com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131) at
com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262) at
com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:219) at
com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:30) at
com.google.firebase.remoteconfig.internal.ConfigFetchHttpClient.setFetchRequestBody(com.google.firebase:firebase-config@@19.0.4:321) at
com.google.firebase.remoteconfig.internal.ConfigFetchHttpClient.fetch(com.google.firebase:firebase-config@@19.0.4:182) ...
9 more
- 为什么会发生这种情况?
- 如何避免呢?
(回调使代码变得丑陋和混乱,为了使代码干净,我更喜欢 Tasks.await)
我联系了 Firebase 支持来解决此问题
他们说
如果设备用户的连接出现问题(如我们的情况),则会发生这种情况
SDK尝试调用获取数据,会导致“客户端
调用后端时出错!“ 错误。这样看来
就像您在验证连接性时做了正确的事情一样
在获取远程配置数据之前您最近的更新。你可以
检查我们的实施情况here https://cs.opensource.google/firebase-sdk/firebase-android-sdk/+/master:firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigFetchHttpClient.java;drc=cfaeae14af2c457c3fb07da4f217f33d45b48a1a;l=196你可以想象我们的通话
这会触发这个问题。
你可以使用Android 网络调试器 https://developer.android.com/studio/profile/network-profiler来模拟
网络调用,这样你就可以捕获你的处理机制以确保
您的实际设备在执行提取时具有正确的连接。
因此问题可能出在设备的网络连接上。我在最近的更新中检查了网络连接。但我仍然在某些设备上遇到此错误。原因可能是设备当前的互联网连接质量较差(@Tash Pemhiwa 在评论中建议)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)