media player - android ANR in MediaPlayer reset -
i've got simple activity plays video through videoview
public class avideo extends activity { private videoview mvideoview; private mediacontroller mc; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.a_video); bundle extras = getintent().getextras(); uri path = uri.parse(extras.getstring("videouri")); mvideoview = (videoview) findviewbyid(r.id.video); mvideoview.setvideouri(path); mc = new mediacontroller(this); mvideoview.setmediacontroller(mc); } @override protected void onresume() { super.onresume(); mvideoview.start(); mc.show(); } }
in cases when user pushes button, on activity, before video starts playing, he's got anr. here's traces:
dalvik threads: "main" prio=5 tid=3 native | group="main" scount=1 dscount=0 s=n obj=0x4001b268 self=0xbd00 | systid=423 nice=0 sched=0/0 cgrp=default handle=-1344001384 @ android.media.mediaplayer._reset(native method) @ android.media.mediaplayer.reset(mediaplayer.java:1028) @ android.widget.videoview.release(videoview.java:476) @ android.widget.videoview.access$2100(videoview.java:49) @ android.widget.videoview$6.surfacedestroyed(videoview.java:467) @ android.view.surfaceview.reportsurfacedestroyed(surfaceview.java:488) @ android.view.surfaceview.updatewindow(surfaceview.java:413) @ android.view.surfaceview.onwindowvisibilitychanged(surfaceview.java:189) @ android.view.view.dispatchwindowvisibilitychanged(view.java:3782) @ android.view.viewgroup.dispatchwindowvisibilitychanged(viewgroup.java:692) @ android.view.viewgroup.dispatchwindowvisibilitychanged(viewgroup.java:692) @ android.view.viewgroup.dispatchwindowvisibilitychanged(viewgroup.java:692) @ android.view.viewroot.performtraversals(viewroot.java:706) @ android.view.viewroot.handlemessage(viewroot.java:1633) @ android.os.handler.dispatchmessage(handler.java:99) @ android.os.looper.loop(looper.java:123) @ android.app.activitythread.main(activitythread.java:4363) @ java.lang.reflect.method.invokenative(native method) @ java.lang.reflect.method.invoke(method.java:521) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:860) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:618) @ dalvik.system.nativestart.main(native method)
also logcat shows this:
07-01 15:11:40.408: warn/libutils.threads(2967): thread (this=0x22818): don't call waitforexit() thread object's thread. it's guaranteed deadlock!
i find this question , this bug, there no solution.
if getting anr message, means applicaction insufficiently responsive period of time, use runonuithread run specified action on ui thread or asynctask
public class avideo extends activity { private videoview mvideoview; private mediacontroller mc; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.a_video); bundle extras = getintent().getextras(); uri path = uri.parse(extras.getstring("videouri")); mvideoview = (videoview) findviewbyid(r.id.video); runonuithread(new runnable() { @override public void run() { mvideoview.setvideouri(path); } }); mc = new mediacontroller(this); mvideoview.setmediacontroller(mc); } @override protected void onresume() { super.onresume(); mvideoview.start(); mc.show(); } }
try implementing setonpreparedlistener start video.
mvideoview.setoncompletionlistener(new oncompletionlistener() { @override public void oncompletion(mediaplayer mp) { log.i("video", "oncompletion"); } }); mvideoview.setonpreparedlistener(new onpreparedlistener() { @override public void onprepared(mediaplayer mp) { log.i("video", "onprepared"); if(mvideoview.canseekforward()) mvideoview.seekto(mvideoview.getduration()/5); mvideoview.start(); } }); mvideoview.setkeepscreenon(true);
Comments
Post a Comment