Что я сделал до сих пор ...
Я использую Tasks.await
блокирующий механизм для вызовов 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 Test Lab . Проблем не было вообще. но когда я выпустил в производство, эта ошибка произошла в некоторых определенных c Mi и Samsung устройствах.
Журнал ошибок
Я смог получить только этот журнал, потому что ошибка возникает в производственном процессе
java .util.concurrent.ExecutionException: com.google.firebase.remoteconfig.FirebaseRemoteConfigClientException: у клиента произошла ошибка при вызове серверной части! на com.google. android .gms.tasks.Tasks.zzb (неизвестный источник: 61) на com.google. android .gms.tasks.Tasks.await (неизвестный источник: 23) на com.maju.myapp .service.SyncWithFirebaseJobIntentService.syncWithFirebaseConfig (SyncWithFirebaseJobIntentService java:. 207) в com.maju.myapp.service.SyncWithFirebaseJobIntentService.onHandleWork (SyncWithFirebaseJobIntentService java:. 55) в androidx.core.app.JobIntentService $ CommandProcessor.doInBackground (JobIntentService . java: 392) в androidx.core.app.JobIntentService $ CommandProcessor.doInBackground (JobIntentService. java: 383) в android .os.AsyncTask $ 3.call (AsyncTask. java: 378) в java .util.concurrent.FutureTask.run (FutureTask. java: 266) в java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java: 1167) в java .util.concurrent.Thread. $ Worker.run (ThreadPoolExecutor. java: 641) в java .lang.Thread.run (Thread. java: 919) Причина: com.google.firebase.remoteconfig.FirebaseRemoteConfigClientException: у клиента возникла ошибка При вызове бэкэнда! на com.google.firebase.remoteconfig.internal.ConfigFetchHttpClient.fetch (com.google.firebase: firebase-config @@ 19.0.4: 194) на com.google.firebase.remoteconfig.internal.ConfigFetchHandler.fetchFromBackend (com.google. .firebase: firebase-config @@ 19.0.4: 278) на com.google.firebase.remoteconfig.internal.ConfigFetchHandler.fetchFromBackendAndCacheResponse (com.google.firebase: firebase-config @@ 19.0.4: 251) на com.google. .firebase.remoteconfig.internal.ConfigFetchHandler.fetchIfCacheExpiredAndNotThrottled (com.google.firebase: firebase-config @@ 19.0.4: 191) в com.google.firebase.remoteconfig.internal.ConfigFetchHandler.lambda firebase: firebase-config @@ 19.0.4: 160) на com.google.firebase.remoteconfig.internal.ConfigFetchHandler $$ Lambda $ 1.then (неизвестный источник: 4) на com.google. android .gms.tasks. zzf.run (неизвестный источник: 2) ... еще 3Причинено: java. net .ConnectException: не удалось подключиться к firebaseremoteconfig.googleapis.com/2404:6800:4007:809::200a:443 в ком . android .okhttp.internal.io. RealConnection.connectSocket (RealConnection. java: 147) на com. android .okhttp.internal.io.RealConnection.connect (RealConnection. java: 116) на com. android .okhttp.internal.http. StreamAllocation.findConnection (StreamAllocation. java: 186) в com. android .okhttp.internal.http.StreamAllocation.findHealthyConnection (StreamAllocation. java: 128) в com. android .okhttp.internal.http. StreamAllocation.newStream (StreamAllocation. java: 97) на com. android .okhttp.internal.http.HttpEngine.connect (HttpEngine. java: 289) на com. android .okhttp.internal.http. HttpEngine.sendRequest (HttpEngine. java: 232) в com. android .okhttp.internal.hu c .HttpURLConnectionImpl.execute (HttpURLConnectionImpl. java: 465) в com. android .h .hu c .HttpURLConnectionImpl.connect (HttpURLConnectionImpl. java: 131) в com. android .okhttp.internal.hu c .HttpURLConnectionImpl. getOutputStream (HttpURLConnectionImpl. java: 262) в com. android .okhttp.internal.hu c. c .HttpsURLConnectionImpl.getOutputStream (HttpsURLConnectionImpl. java: 30) по адресу com.google.firebase.remoteconfig.internal.ConfigFetchHttpClient.setFetchRequestBody (com.google.firebase@ 32.0 config.basebase- .google.firebase.remoteconfig.internal.ConfigFetchHttpClient.fetch (com.google.firebase: firebase-config @@ 19.0.4: 182) ... еще 9
- Почему это так происходит?
- Как этого избежать?
(Обратные вызовы делают код уродливым и грязным, для создания чистого кода я предпочитаю Tasks.await)