Android 为我的意图服务
我有一个IntentService,它创建一个新线程并运行一个长操作Android 为我的意图服务,android,multithreading,intentservice,android-anr-dialog,Android,Multithreading,Intentservice,Android Anr Dialog,我有一个IntentService,它创建一个新线程并运行一个长操作 @Override protected void onHandleIntent(Intent intent) { Log.d(TAG, "onHandleIntent at " + Calendar.getInstance().getTime()); new Thread() { public void run() { Pr
@Override
protected void onHandleIntent(Intent intent) {
Log.d(TAG, "onHandleIntent at " + Calendar.getInstance().getTime());
new Thread() {
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
<< A VERY LONG OPERATION == NETWORK + FILESYSTEM etc >>
};
}.start();
}
此外,位于/data/anr/traces.txt的跟踪文件不显示此服务的任何线程堆栈。我只能看到主线程的堆栈(正在播放视频)和其他异步任务线程。
顺便问一下,主线程是否正在忙于设置数据源以创建ANR的后台线程?
欢迎任何指导
以下是主线程和刷新线程的堆栈跟踪:
堆栈跟踪:
DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)
"main" prio=5 tid=1 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x40b06460 self=0x12958
| sysTid=1248 nice=0 sched=0/0 cgrp=default handle=1074144680
| schedstat=( 0 0 0 ) utm=100 stm=30 core=0
at android.media.MediaPlayer._setDataSource(Native Method)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:884)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:846)
at android.widget.VideoView.openVideo(VideoView.java:275)
at android.widget.VideoView.access$2100(VideoView.java:49)
at android.widget.VideoView$6.surfaceCreated(VideoView.java:520)
at android.view.SurfaceView.updateWindow(SurfaceView.java:597)
at android.view.SurfaceView.access$000(SurfaceView.java:86)
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:174)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1617)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
"Thread-158" prio=5 tid=20 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x411a38a8 self=0x25af28
| sysTid=1301 nice=0 sched=0/0 cgrp=default handle=1661840
| schedstat=( 0 0 0 ) utm=1 stm=3 core=0
at libcore.io.Posix.recvfromBytes(Native Method)
at libcore.io.Posix.recvfrom(Posix.java:131)
at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
at libcore.io.IoBridge.recvfrom(IoBridge.java:503)
at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191)
at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:180)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)
at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:428)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at x.y.z.c.a.b(SourceFile:597)
at x.y.z.c.a.a(SourceFile:529)
at x.y.z.c.a.a(SourceFile:214)
at x.y.z.c.i.e(SourceFile:290)
at x.y.z.services.a.run(SourceFile:43)
我用While(真的)操纵了它,它工作得很好,
从启动服务的日志中,尝试共享其他代码详细信息。是否将活动绑定到服务? 如果是这样,请确保只绑定一次。 如果您多次绑定到它,它在完成其工作时不会停止,这可能会导致您的ANR:
请参阅:我的是一个IntentService,我通过AlarmManger作为PendingEvent启动它。我一点也不绑定。不是真的,我在onHandleIntent之后创建了一个线程。我已将stacktrace附加到我的帖子中。是否您的线程正在访问相同的对象?或者您正试图在非UI工作线程上执行UI操作?是的,我的线程可能访问相同的对象。但这有关系吗?我以为我们只能访问UI对象。我们也不会用同步锁定任何对象。不仅仅是UI。。。例如,如果您正在访问和修改一个数组,该怎么办?在这种情况下,你需要保护那个物体
DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)
"main" prio=5 tid=1 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x40b06460 self=0x12958
| sysTid=1248 nice=0 sched=0/0 cgrp=default handle=1074144680
| schedstat=( 0 0 0 ) utm=100 stm=30 core=0
at android.media.MediaPlayer._setDataSource(Native Method)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:884)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:846)
at android.widget.VideoView.openVideo(VideoView.java:275)
at android.widget.VideoView.access$2100(VideoView.java:49)
at android.widget.VideoView$6.surfaceCreated(VideoView.java:520)
at android.view.SurfaceView.updateWindow(SurfaceView.java:597)
at android.view.SurfaceView.access$000(SurfaceView.java:86)
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:174)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1617)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
"Thread-158" prio=5 tid=20 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x411a38a8 self=0x25af28
| sysTid=1301 nice=0 sched=0/0 cgrp=default handle=1661840
| schedstat=( 0 0 0 ) utm=1 stm=3 core=0
at libcore.io.Posix.recvfromBytes(Native Method)
at libcore.io.Posix.recvfrom(Posix.java:131)
at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
at libcore.io.IoBridge.recvfrom(IoBridge.java:503)
at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191)
at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:180)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)
at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:428)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at x.y.z.c.a.b(SourceFile:597)
at x.y.z.c.a.a(SourceFile:529)
at x.y.z.c.a.a(SourceFile:214)
at x.y.z.c.i.e(SourceFile:290)
at x.y.z.services.a.run(SourceFile:43)