主线程正在等待sqlcipher游标关闭

时间:2016-06-13 19:58:59

标签: android multithreading android-contentprovider sqlcipher

在我的应用程序中,我们正在为工作线程中的大约2000条记录执行applyBatch。

同时如果我旋转屏幕我会变黑屏幕。

  

"主@ 6280" prio = 5等待     java.lang.Thread.State:WAITING        阻止主要@ 6280         在java.lang.Object.wait(Object.java:-1)         at java.lang.Thread.parkFor $(Thread.java:1220)          - 已锁定< 0x18c5> (一个java.lang.Object)         在sun.misc.Unsafe.park(Unsafe.java:299)         在java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)         at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:810)         at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:844)         at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1173)         at java.util.concurrent.locks.ReentrantLock $ FairSync.lock(ReentrantLock.java:196)         at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:257)         在net.sqlcipher.database.SQLiteDatabase.lock(SQLiteDatabase.java:490)         at net.sqlcipher.database.SQLiteProgram.close(SQLiteProgram.java:294)         at net.sqlcipher.database.SQLiteQuery.close(SQLiteQuery.java:136)         在net.sqlcipher.database.SQLiteCursor.close(SQLiteCursor.java:510)         在android.database.CursorWrapper.close(CursorWrapper.java:50)         在android.database.CursorWrapper.close(CursorWrapper.java:50)         在android.content.ContentResolver $ CursorWrapperInner.close(ContentResolver.java:2512)         在android.database.CursorWrapper.close(CursorWrapper.java:50)

我尝试过YieldAllowed,但没有运气。 知道为什么主线程正在等待光标关闭以及这个问题的任何解决方案吗?

1 个答案:

答案 0 :(得分:1)

at java.util.concurrent.locks.ReentrantLock$FairSync.lock(ReentrantLock.java:196) 
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:257) at 

调试并检查哪个线程持有锁定以及为什么会出现死锁

当你进行数据库操作时:

  • 哪个线程正在进行数据库操作?
  • 您是否正在使用该内容提供商或数据库助手?
  • 你是锁定数据库还是使用一些库?
  • 你使用游标加载器吗?如果是这样,你会调用任何操作活动线程的方法吗?

无法锁定ReentrantLock

Without lock

ReentrantLock因主线程

而被锁定

With lock from  main thread

  

构建一个Android应用程序,基本上你需要了解并发,同步,锁定

https://docs.oracle.com/javase/tutorial/essential/concurrency/ https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html https://docs.oracle.com/javase/tutorial/essential/concurrency/liveness.html

从那里开始挖掘: 的 net.sqlcipher.database.SQLiteDatabase.lock(SQLiteDatabase.java:490)

  • 尝试将批处理交易分成几个较小的交易
  • 尝试定期执行SQLiteDatabase#yieldIfContendedSafely()以在长时间更新事务期间临时释放锁定。
  • 尝试通过调用SQLiteDatabase :: setLockingEnabled(false)来禁用锁 - 这应禁用可重入锁

你在dalvik和艺术上都有这个问题吗?