Android 具有同步方法的Anr消息

Android 具有同步方法的Anr消息,android,multithreading,asynchronous,Android,Multithreading,Asynchronous,当我试图从数据库中获取数据时,我得到了ANR public synchronized void insertNewObstacle(Obstacle newObstacle) { SQLiteDatabase db = this.getWritableDatabase(); db.execSQL("Insert into "+OBSTACLES_TABLE+" Values ( ' "+ new

当我试图从数据库中获取数据时,我得到了ANR

    public synchronized void  insertNewObstacle(Obstacle newObstacle) {

            SQLiteDatabase db = this.getWritableDatabase();

            db.execSQL("Insert into "+OBSTACLES_TABLE+" Values ( ' "+
                    newObstacle.getLongitude()  + "' , ' " +
                    newObstacle.getLatitude()   + "' , ' " +
                    newObstacle.getDirection()  + "' , ' " +
                    newObstacle.getType()       + "' , ' " +
                    newObstacle.getAddress()    + "' , '" +
                    newObstacle.getSubmissionTime()     + "' , '" +
                    newObstacle.getSubmitterName() + "' )"
                    );

            db.close();

        }
发生ANR是因为我从服务器获取数据,然后将其保存在本地 保存后(线程1),我试图获取保存的数据(线程2),这就是为什么我要 方法已同步

我的问题是:

为什么它不起作用而我却收到了那个愚蠢的ANR信息

或者我应该指定访问该方法的顺序吗

1.我使用asyncTaskLoader从服务器获取数据并保存它(线程1)

2.asyncTask用于将数据发布到UI线程(线程2)

跟踪文件:

at com.nilecode.matabat.AnonymousUser.DrawTypes(AnonymousUser.java:458)

at com.nilecode.matabat.AnonymousUser$MainNotificationReceiver.onReceive
(AnonymousUser.java:1085)

at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:763)

 at android.os.Handler.handleCallback(Handler.java:730)

at android.os.Handler.dispatchMessage(Handler.java:92)

at android.os.Looper.loop(Looper.java:137)

at android.app.ActivityThread.main(ActivityThread.java:5103)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:525)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)

at dalvik.system.NativeStart.main(Native Method)

"AsyncTask #3" prio=5 tid=32 WAIT

| group="main" sCount=1 dsCount=0 obj=0xa57ed5e8 self=0xb8fcd4a0

| sysTid=2608 nice=10 sched=0/0 cgrp=[fopen-error:2] handle=-1191480800

| state=S schedstat=( 21993697 71845945 80 ) utm=0 stm=1 core=0

at java.lang.Object.wait(Native Method)
  - waiting on <0xa57ed700> 
(a java.lang.VMThread) held by tid=32 (AsyncTask #3)

at java.lang.Thread.parkFor(Thread.java:1205)

at sun.misc.Unsafe.park(Unsafe.java:325)

at java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)

at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await
(AbstractQueuedSynchronizer.java:2019)

at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:413)

at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)

at java.lang.Thread.run(Thread.java:841)

"AsyncTask #2" prio=5 tid=29 WAIT

| group="main" sCount=1 dsCount=0 obj=0xa615bb08 self=0xb8e5b228

| sysTid=2578 nice=10 sched=0/0 cgrp=[fopen-error:2] handle=-1192800808

| state=S schedstat=( 29573221 22137266 67 ) utm=1 stm=1 core=0

at java.lang.Object.wait(Native Method)

- waiting on <0xa60b1a28> (a java.lang.VMThread) held by tid=29 (AsyncTask #2)

at java.lang.Thread.parkFor(Thread.java:1205)

at sun.misc.Unsafe.park(Unsafe.java:325)

at java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)

at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await
(AbstractQueuedSynchronizer.java:2019)

at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:413)

at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)

at java.lang.Thread.run(Thread.java:841)

"Binder_3" prio=5 tid=28 NATIVE

| group="main" sCount=1 dsCount=0 obj=0xa5144ba0 self=0xb8dd33e0

| sysTid=2574 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1194498544

| state=S schedstat=( 3711612 4635252 33 ) utm=0 stm=0 core=0
  #00  pc 0002cff4  
/system/lib/libc.so (__ioctl+20)

at dalvik.system.NativeStart.run(Native Method)

"RenderDrive" prio=5 tid=27 SUSPENDED

 | group="main" sCount=1 dsCount=0 obj=0xa52ffd40 self=0xb8cf1eb0

| sysTid=2559 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1194081904

| state=S schedstat=( 278861639 194938487 3193 ) utm=0 stm=27 core=1
  #00  pc 0002ed67  
/system/lib/libc.so (__futex_syscall4+23)

at java.lang.VMThread.sleep(Native Method)

at java.lang.Thread.sleep(Thread.java:1013)

at java.lang.Thread.sleep(Thread.java:995)

at maps.p.b.c((null):-1)

at maps.an.b.run((null):-1)

"IntentService[Request New Dataset Service]" prio=5 tid=26 SUSPENDED

| group="main" sCount=1 dsCount=0 obj=0xa60b9148 self=0xb8cce168

| sysTid=2557 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1194331408

| state=S schedstat=( 22023302408 4429908617 55349 ) utm=209 stm=1992 core=0
  #00  pc 0002ed67  
/system/lib/libc.so (__futex_syscall4+23)

at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)

at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:734)

at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)

at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)

at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)

at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1603)

at com.nilecode.matabat.data.LocalCachedObstacles.insertNewObstacle(LocalCachedObstacles.java:74)

at com.nilecode.matabat.data.LocalCachedObstacles.insertNewDataSet(LocalCachedObstacles.java:62)

at com.nilecode.matabat.ServerAsyncLoader.loadInBackground(ServerAsyncLoader.java:162)

at com.nilecode.matabat.RequestNewDataSetService.requestAndCacheNearByLocations
(RequestNewDataSetService.java:134)
com.nilecode.matabat.AnonymousUser.DrawTypes(AnonymousUser.java:458)
在com.nilecode.matabat.AnonymousUser$MainNotificationReceiver.onReceive上
(AnonymousUser.java:1085)
在android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:763)中
位于android.os.Handler.handleCallback(Handler.java:730)
位于android.os.Handler.dispatchMessage(Handler.java:92)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:5103)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:525)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:737)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
在dalvik.system.NativeStart.main(本机方法)
“异步任务#3”优先级=5 tid=32等待
|group=“main”scont=1 dsCount=0 obj=0xa57ed5e8 self=0xb8fcd4a0
|sysTid=2608 nice=10 sched=0/0 cgrp=[fopen错误:2]句柄=-1191480800
|state=S schedstat=(21993697 71845945 80)utm=0 stm=1 core=0
在java.lang.Object.wait(本机方法)
-等待
(一个java.lang.VMThread)由tid=32(AsyncTask#3)持有
在java.lang.Thread.parkFor(Thread.java:1205)
在sun.misc.Unsafe.park(Unsafe.java:325)
位于java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)
位于java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await
(AbstractQueuedSynchronizer.java:2019)
位于java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:413)
位于java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
运行(Thread.java:841)
“异步任务#2”优先级=5 tid=29等待
|group=“main”scont=1 dsCount=0 obj=0xa615bb08 self=0xb8e5b228
|sysTid=2578 nice=10 sched=0/0 cgrp=[fopen错误:2]句柄=-1192800808
|state=S schedstat=(29573221221372666 67)utm=1 stm=1 core=0
在java.lang.Object.wait(本机方法)
-等待tid=29(AsyncTask#2)持有的(java.lang.VMThread)
在java.lang.Thread.parkFor(Thread.java:1205)
在sun.misc.Unsafe.park(Unsafe.java:325)
位于java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)
位于java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await
(AbstractQueuedSynchronizer.java:2019)
位于java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:413)
位于java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
运行(Thread.java:841)
“活页夹3”优先级=5 tid=28本机
|group=“main”scont=1 dsCount=0 obj=0xa5144ba0 self=0xb8dd33e0
|sysTid=2574 nice=0 sched=0/0 cgrp=[fopen错误:2]句柄=-1194498544
|state=S schedstat=(3711612 4635252 33)utm=0 stm=0 core=0
#00件0002cff4
/system/lib/libc.so(ioctl+20)
在dalvik.system.NativeStart.run(本机方法)
“RenderDrive”优先级=5 tid=27暂停
|group=“main”scont=1 dsCount=0 obj=0xa52ffd40 self=0xb8cf1eb0
|sysTid=2559 nice=0 sched=0/0 cgrp=[fopen错误:2]句柄=-1194081904
|state=S schedstat=(278861639 194938487 3193)utm=0 stm=27 core=1
#00件0002ed67
/system/lib/libc.so(\uuuufutex\usyscall4+23)
位于java.lang.VMThread.sleep(本机方法)
位于java.lang.Thread.sleep(Thread.java:1013)
位于java.lang.Thread.sleep(Thread.java:995)
位于maps.p.b.c((空):-1)
at maps.an.b.run((null):-1)
“IntentService[请求新数据集服务]”prio=5 tid=26挂起
|group=“main”scont=1 dsCount=0 obj=0xa60b9148 self=0xb8cce168
|sysTid=2557 nice=0 sched=0/0 cgrp=[fopen错误:2]句柄=-1194331408
|state=S schedstat=(22023302408 4429908617 55349)utm=209 stm=1992 core=0
#00件0002ed67
/system/lib/libc.so(\uuuufutex\usyscall4+23)
位于android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(本机方法)
位于android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:734)
位于android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
位于android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
位于android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
位于android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1603)
在com.nilecode.matabat.data.LocalCachedObstacles.insertnewbarrier(LocalCachedObstacles.java:74)
位于com.nilecode.matabat.data.LocalCachedStacles.insertNewDataSet(LocalCachedStacles.java:62)
位于com.nilecode.matabat.ServerAsyncLoader.loadInBackground(ServerAsyncLoader.java:162)
位于com.nilecode.matabat.RequestNewDataSetService.requestAndCacheNearByLocations
(RequestNewDataSetService.java:134)

当UI线程的响应时间不超过5秒时,将显示ANR消息(因设备而异)。我认为您是从UI线程调用方法,该线程与您调用的
insertnewbarrier
方法在同一个对象上同步


还有,你为什么要用两个独立的线程来写和读呢?只需使用一个
AsyncTask
,它将从网络获取数据,并在obj上的
doInBackground
synchronized
方法锁中的UI线程上显示数据