Java 与SQLite交互时的ANR

Java 与SQLite交互时的ANR,java,android,sqlite,android-anr-dialog,Java,Android,Sqlite,Android Anr Dialog,有时在与SQLite交互时获得ANR不是崩溃,而是ANR 崩溃日志总是相同的。即使SQL请求在UI线程上执行,也有1-2个快速请求,没有循环等 找不到任何类似的ANR。看起来它在等待本机代码中的互斥。因为这行代码,它甚至不是SQLite Java_android_util_Log_isLoggable_uuLJava_lang_String_2I+116) 位于android.util.Log.isLoggable(本机方法) 有挖掘的方向吗 ANR跟踪 DALVIK THREADS (22):

有时在与SQLite交互时获得ANR不是崩溃,而是ANR

崩溃日志总是相同的。即使SQL请求在UI线程上执行,也有1-2个快速请求,没有循环等

找不到任何类似的ANR。看起来它在等待本机代码中的互斥。因为这行代码,它甚至不是SQLite

Java_android_util_Log_isLoggable_uuLJava_lang_String_2I+116) 位于android.util.Log.isLoggable(本机方法)

有挖掘的方向吗

ANR跟踪

DALVIK THREADS (22):
"main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 obj=0x72b6a700 self=0xb483d500
  | sysTid=1459 nice=0 cgrp=default sched=0/0 handle=0xb6f48bec
  | state=S schedstat=( 38819958947 298321576 2674 ) utm=2603 stm=1278 core=2 HZ=100
  | stack=0xbe11b000-0xbe11d000 stackSize=8MB
  | held mutexes=
  native: #00 pc 000133bc  /system/lib/libc.so (syscall+28)
  native: #01 pc 000a8be3  /system/lib/libart.so (art::ConditionVariable::Wait(art::Thread*)+82)
  native: #02 pc 0027bb5d  /system/lib/libart.so (art::GoToRunnable(art::Thread*)+756)
  native: #03 pc 000872b9  /system/lib/libart.so (art::JniMethodEnd(unsigned int, art::Thread*)+8)
  native: #04 pc 00086da1  /data/dalvik-cache/arm/system@framework@boot.oat (Java_android_util_Log_isLoggable__Ljava_lang_String_2I+116)
  at android.util.Log.isLoggable(Native method)
  at android.database.CursorWindow.recordNewWindow(CursorWindow.java:725)
  - locked <@addr=0x6f920340> (a android.util.LongSparseArray)
  at android.database.CursorWindow.<init>(CursorWindow.java:112)
  at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
  at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:139)
  at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
  at com.xxx.xxx.xxx.getChildren(xxx.java:1122)
  at com.xxx.xxx.xxx.getFolderFromDatabase(xxx.java:1109)
  at com.xxx.xxx.xxx.getFolder(xxx.java:868)
  at com.xxx.xxx.yyy.getFolder(StationFolder.java:644)
  at com.xxx.xxx.yyy.getParent(StationFolder.java:251)
  at com.xxx.xxx.utils.CategoryItemUtils.getPathByRootItem(CategoryItemUtils.java:244)
  at com.xxx.xxx.ui.adapter.UniversalListAdapter.loadData(UniversalListAdapter.java:237)
  at com.xxx.xxx.ui.fragment.UniversalListFragment$LoadCategoryDataAsync.onPostExecute(UniversalListFragment.java:761)
  at android.os.AsyncTask.finish(AsyncTask.java:636)
  at android.os.AsyncTask.access$500(AsyncTask.java:177)
  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:135)
  at android.app.ActivityThread.main(ActivityThread.java:5258)
  at java.lang.reflect.Method.invoke!(Native method)
  at java.lang.reflect.Method.invoke(Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:940)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:735)
DALVIK螺纹(22):
“主”优先级=5 tid=1本机
|group=“main”scont=1 dsCount=0 obj=0x72b6a700 self=0xb483d500
|sysTid=1459 nice=0 cgrp=default sched=0/0 handle=0xb6f48bec
|state=S schedstat=(38819958947 298321576 2674)utm=2603 stm=1278内核=2 HZ=100
|堆栈=0xbe11b000-0xbe11d000堆栈大小=8MB
|保持互斥=
本机:#00 pc 00013bc/system/lib/libc.so(syscall+28)
本机:#01 pc 000a8be3/system/lib/libart.so(艺术::条件变量::等待(艺术::线程*)+82)
本机:#02 pc 0027bb5d/system/lib/libart.so(art::gotorunable(art::Thread*)+756)
本机:#03 pc 000872b9/system/lib/libart.so(art::jnimethoded(unsigned int,art::Thread*)+8)
本机:#04 pc 00086da1/data/dalvik cache/arm/system@framework@boot.oat(Java_android_util_Log_isLoggable_uuuljava_lang_String_2I+116)
位于android.util.Log.isLoggable(本机方法)
位于android.database.CursorWindow.recordNewWindow(CursorWindow.java:725)
-锁定(一个android.util.LongSparseArray)
位于android.database.CursorWindow(CursorWindow.java:112)
位于android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
位于android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:139)
位于android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
位于com.xxx.xxx.xxx.getChildren(xxx.java:1122)
位于com.xxx.xxx.xxx.getFolderFromDatabase(xxx.java:1109)
位于com.xxx.xxx.xxx.getFolder(xxx.java:868)
位于com.xxx.xxx.yyy.getFolder(StationFolder.java:644)
位于com.xxx.xxx.yyy.getParent(StationFolder.java:251)
在com.xxx.xxx.utils.CategoryItemUtils.getPathByRootItem上(CategoryItemUtils.java:244)
位于com.xxx.xxx.ui.adapter.UniversalListAdapter.loadData(UniversalListAdapter.java:237)
位于com.xxx.xxx.ui.fragment.UniversalListFragment$LoadCategoryDataAsync.onPostExecute(UniversalListFragment.java:761)
位于android.os.AsyncTask.finish(AsyncTask.java:636)
在android.os.AsyncTask.access$500(AsyncTask.java:177)
在android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)中
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:135)
位于android.app.ActivityThread.main(ActivityThread.java:5258)
在java.lang.reflect.Method.invoke!(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:940)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:735)

将SQL操作移动到后台线程

在此处发布代码为什么要在UI线程上执行SQL请求?