в настройках. Это работа для меня!

ешно перенес свое приложение из RealtimeDB в Firestore, но после миграции приложение слишком часто вылетает со следующей ошибкой, как это исправить? Я никогда не сталкивался с этой ошибкой при использовании RealtimeDB

Fatal Exception: java.lang.RuntimeException: Internal error in Firestore (0.6.6-dev).

   at com.google.android.gms.internal.zzejs.run(Unknown Source)
   at android.os.Handler.handleCallback(Handler.java:751)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6184)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:788)`

Caused by java.lang.RuntimeException: Failed to gain exclusive lock to the Firestore client's offline persistence. 
This generally means you are using Firestore from multiple processes in your app. 
Keep in mind that multi-process Android apps execute the code in your Application class in all processes, 
so you may need to avoid initializing Firestore in your Application class. 
If you are intentionally using Firestore from multiple processes, 
you can only enable offline persistence (i.e. call setPersistenceEnabled(true)) in one of them.

  `at com.google.android.gms.internal.zzefi.start(Unknown Source)
   at com.google.android.gms.internal.zzeca.zza(Unknown Source)
   at com.google.android.gms.internal.zzecc.run(Unknown Source)
   at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
   at com.google.android.gms.internal.zzejp$zza.run(Unknown Source)
   at java.lang.Thread.run(Thread.java:761)`
 iiylll13 нояб. 2017 г., 14:12
Вы открывали соединение с Firestore много раз? Пожалуйста, укажите, какой SDK и версию вы используете. Я думаю, это Android Java SDK, верно?
 Sandip Soni14 мар. 2018 г., 11:22
У меня была точно такая же ошибка. Я обернул код вставки firestore с помощью Single of RxJava2 и, подписываясь на это, я указывалsubscribeOn(Schedulers.io), Это было проблемой, потому что Schedulers.io инициировал другой поток

Ответы на вопрос(4)

какая@Sandip Soni будет работать всякий раз, когда различные вызовы не чередуют друг друга (например, повторяющиеся вставки), и в силу асинхронной природы Firebase они, вероятно, будут это делать. Для меня сработал небольшой взлом, синхронизировавший доступ кFirestore экземпляр и запуск одной операции записи вне любого внешнего потока, чтобы позволитьFirestore получить локальный экземпляр БД в своем собственном потоке. Операция записи является произвольной, это было только для цели установки:

class Firestore {
    companion object {
       val instance: FirebaseFirestore by lazy {
           [email protected] synchronized(Firestore::class){
               FirebaseFirestore.getInstance().apply { lock() }
           }
       }

       private fun FirebaseFirestore.lock() {
          collection("config").document("db").update("locked", true)
       }
    }
}

Application's cache в настройках. Это работа для меня!

эта проблема возникнет. Поэтому, если вы используете RX, вам нужно создать единый фоновый поток для всех вставок. Это потому, что Firestore блокирует БД во время записи.

val FIRESTORE_OPERATION_THREAD = Schedulers.single()
yourSingle.subscribeOn(FIRESTORE_OPERATION_THREAD)
. ...
 m.ab02 апр. 2018 г., 11:30
Доступ к базе данных осуществляется из нескольких потоков, и я не использую RX. Так что это решение не будет работать для меня
 Debanjan02 апр. 2018 г., 11:45
Нет проблем, тогда используйте исполнителей. val myExecutor = Executors.newSingleThreadExecutor () myExecutor.execute (yourRunnable) Прежде чем использовать это, прочитайте его документацию один раз.

жении. Многопроцессные приложения Android выполняют код в вашем классе Application во всех процессах.

Для устранения ошибки вам может понадобиться:

Избегайте инициализации Firestore в вашем классе Application или в модуле для Rxjava. Вместо,инициализировать новый экземпляр Firestore перед каждым вызовом базы данных firestore нравится:

val fireStore = FirebaseFirestore.getInstance()
val settings = FirebaseFirestoreSettings.Builder()
        //offline persistence is enabled automatically in Android
        .setTimestampsInSnapshotsEnabled(true)
        .build()
fireStore.firestoreSettings = settings
//go ahead and call database using the Firestore instance

Это означает, что вы не будете использовать один и тот же экземпляр Firestore для нескольких вызовов.

Затем очистите кеш приложения.

 Suraj Rao11 окт. 2018 г., 09:45
Пожалуйста, не добавляйтетот же ответ на несколько вопросов. Ответьте лучшим и отметьте остальные как дубликаты. ВидетьДопустимо ли добавить дублирующий ответ на несколько вопросов?

Ваш ответ на вопрос