3

これは、開発コンソールの ANR エラーで報告されています。onSignalStrengthsChanged長い SQL クエリの ANR を停止するには、サービスでワーカー スレッドを生成する必要がありますか?

これがミューテックスロックかどうかもわかりませんが、.db を介してのみデータベースにアクセスしますContentProvider

これは長いクエリの ANR ですか、それともミューテックス ロックの ANR ですか?

DALVIK スレッド: (ミューテックス: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0) "main" prio=5 tid=1 ネイティブ | group="main" sCount=1 dsCount=0 obj=0x4002a278 self=0xcf50 | sysTid=9149 ナイス=0 スケジュール=0/0

at android.database.sqlite.SQLiteStatement.native_execute(Native Method) 
at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:61)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1582)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1426)
at kenyu73.realsignal.DatabaseProvider.insert(DatabaseProvider.java:55)  
at android.content.ContentProvider$Transport.insert(ContentProvider.java:198)
at android.content.ContentResolver.insert(ContentResolver.java:618)  
at kenyu73.realsignal.DatabaseWrapper.insert(DatabaseWrapper.java:189)
at kenyu73.realsignal.SignalStats.updateDbStats(SignalStats.java:154) 
at kenyu73.realsignal.SignalStats.updateSignalStats(SignalStats.java:116)
at kenyu73.realsignal.RealSignalService$2.onSignalStrengthsChanged(RealSignalService.java:156)
at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:329)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)   
at android.app.ActivityThread.main(ActivityThread.java:3695)   
at java.lang.reflect.Method.invokeNative(Native Method)   
at java.lang.reflect.Method.invoke(Method.java:507)   
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)   
at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

1

コンテンツ プロバイダーのクエリのデフォルトは ui スレッドで実行されるため、クエリを実行する新しいスレッドを作成することをお勧めします。

また、mutex lockロックされているロックを取得しようとすると何度も使用されますが、スレッドが 1 つだけであれば、ロックは必要ないかもしれません。

于 2012-04-06T03:38:33.813 に答える