Android Firestore : Failed to gain exclusive lock to the Firestore client's offline persistence

标签 android android-studio service google-cloud-firestore

我正在开发一个 Android 应用程序,每 10 秒更新一次用户的位置。为此,我在服务中运行计时器任务并将 LatLng 值写入 Firestore 数据库。

以下是我的timerTask类。

class UploadDataTimerTask extends TimerTask {

    @Override
    public void run() {
        // run on another thread
        mHandler.post(new Runnable() {

            @Override
            public void run() {

                Log.d("TAG", String.valueOf(mLatLong));

                mFireStore.collection(Constants.LOCATION_REFERENCE).document(mUser.getUid()).set(mLatLong).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {

                        if (task.isSuccessful()) {
                            Log.d("TAG", "Upload successful.");
                        }
                    }
                });
            }
        });
    }
}

但是,当我尝试将此数据写入 Firestore 时,出现以下错误。

FATAL EXCEPTION: main
Process: com.sarthak.trackit.trackit:my_service, PID: 24286
java.lang.RuntimeException: Internal error in Firestore (0.6.6-dev).
    at com.google.android.gms.internal.zzeux.run(Unknown Source:23)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6809)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
    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.zzeqn.start(Unknown Source:34)
    at com.google.android.gms.internal.zzenf.zza(Unknown Source:54)
    at com.google.android.gms.internal.zzenh.run(Unknown Source:8)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at com.google.android.gms.internal.zzeuu$zza.run(Unknown Source:7)
    at java.lang.Thread.run(Thread.java:764)
    Caused by: android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
    at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634)
    at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:320)
    at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:294)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
    at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
    at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:833)
    at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:818)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:721)
    at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:740)
    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:300)
    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:254)
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:194)
    at com.google.android.gms.internal.zzeqn.start(Unknown Source:19)
    at com.google.android.gms.internal.zzenf.zza(Unknown Source:54) 
    at com.google.android.gms.internal.zzenh.run(Unknown Source:8) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
    at com.google.android.gms.internal.zzeuu$zza.run(Unknown Source:7) 
    at java.lang.Thread.run(Thread.java:764) 

我查了很多资料,但没能找到问题所在。我该如何解决这个问题?

最佳答案

Firestore 无法从第一次写入操作时所在的线程以外的线程访问,因为这是创建对本地数据库的引用的时间,请记住 Firestore 异步运行它们的所有操作(它们不会阻塞调用线程),但它们的回调是在主循环器上调用的,这意味着,查看您的代码,您的问题已解决,将帖子删除到处理程序和 < em>推荐为回调传递一个执行器,如下:

mFireStore.collection(Constants.LOCATION_REFERENCE).document(mUser.getUid()).set(mLatLong).addOnCompleteListener(Executors.newSingleThreadExecutor(),new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {

                        if (task.isSuccessful()) {
                            Log.d("TAG", "Upload successful.");
                        }
                    }
                });
            }
        });
    }

关于Android Firestore : Failed to gain exclusive lock to the Firestore client's offline persistence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49518993/

相关文章:

android - Google Play 游戏服务和 Google Drive API 已弃用

安卓工作室 : distances shown on layout preview appear larger on device

c# - 在服务之间共享 HttpClient

service - 使用 sc create 将带有额外参数的 .exe 作为 Windows 服务运行

android - 销毁 HistoryRecord 超时

android:连接调试器时, Activity 显示为黑屏

android - 如何避免android中相对布局中的重叠 View ?

java - android - 启动模式为 'singleInstance' 的两个 Activity

intellij-idea - 将 ViewPagerIndicator 添加到项目中

grails:维护从服务到 Controller 的事务上下文