数据库的连接池无法授予与标志为 0x1 的线程 602 (Binder_2) 的连接

Kar*_*urg 5 java sqlite android

几个小时以来,我一直试图弄清楚为什么我的应用程序数据库会死锁。

我有一个应用程序,它从活动中读取数据库并从服务中写入数据库。很直接。

我将我的数据库连接设置为一个实例:

public static synchronized MuseoDatabase getInstance(Context context){
    if(sInstance == null){
        sInstance = new MuseoDatabase(context);
    }
    return sInstance;
}
Run Code Online (Sandbox Code Playgroud)

服务

在我的服务中,我有一个Runnable定期更新数据库的事务。有时甚至有大块(300 多个条目)的数据。

在服务中,我打开了用于写入的实例

final SQLiteDatabase db = MuseoDatabase.getInstance(getApplicationContext()).getWritableDatabase();
Run Code Online (Sandbox Code Playgroud)

该服务工作正常。它很好地更新了数据库,那里一切都很好。

有问题的活动

现在我有一个接受 RFID 和数字代码输入的活动,它们都通过一种validateCode()方法进行验证。

为此,我以读取模式打开数据库实例

final SQLiteDatabase db = MuseoDatabase.getInstance(getApplicationContext()).getReadableDatabase();
Run Code Online (Sandbox Code Playgroud)

现在是有趣的部分

正如我上面所说,RFID uuid 和数字代码都通过相同的方法进行验证,因为该值保存在同一个 SQLite 表中。

当我验证代码时,一切正常。它正确地检查数据库中的代码以及它是否有效等。但是现在如果我要读取 RFID:死锁和错误:

The connection pool for database has been unable to grant a connection to thread 602 (Binder_2) with flags 0x1
Run Code Online (Sandbox Code Playgroud)

它甚至会导致应用程序的 RFID 阅读器出现故障(不再检测到 rfid 卡)。数字代码没有问题,但是当使用 rfid 时,尽管他们都起诉了相同的方法,但它只是失败了。

由于rfid卡故障后,数字代码仍然继续起作用,这使得它更加奇怪。

我哪里出错了?