请教关于VideoView ANR 问题

一般一般世界第三 2017-05-15 05:00:12
本人工作需要,要实现一功能:
1. listview下切换焦点时,快速切换且播放不同的MP4文件。
问题:
1,当快速移动焦点时,要不断的stop/start mp4文件,此时会相当容易出现ANR问题,如果不播放MP4文件就没有问题。


本人实现方式如下:

1. 在listView.setOnItemClickListener下用handler.post方式去切换播放MP4视频。
handler实现如下:


final Handler Mp4PlayHander = new Handler();
final Runnable Mp4PlayResults = new Runnable() {
public void run() {
System.out.println("Runnable Mp4PlayResults");
video1.stopPlayback();
playVideo("/storage/external_storage/sdcard1/video/a.mp4");
}
};

private void playVideo(String path) {
video1.setVideoPath(path);
video1.start();
}


Logcat 打印如下(log看CPU没有100%负荷,所以说估计是阻塞了..... ):


01-02 10:33:59.140 492-523/? I/InputDispatcher: Application is not responding: AppWindowToken, It has been 5238.0ms since event, 5004.4ms since wait started. Reason: Waiting because the focused window has not finished processing the input events that were previously delivered to it.
01-02 10:33:59.140 492-523/? I/WindowManager: Input event dispatching timed out sending to com.seleuco.mame4droid/com.seleuco.mame4droid.MAME4droid. Reason: Waiting because the focused window has not finished processing the input events that were previously delivered to it.


01-02 10:34:01.450 492-506/? E/ActivityManager: ANR in com.abc.mainactivity
PID: 632
Reason: Input dispatching timed out (Waiting because the focused window has not finished processing the input events that were previously delivered to it.)
Load: 1.71 / 0.57 / 0.2
CPU usage from 12900ms to 1440ms ago:
33% 632/com.abc.mainactivity: 26% user + 6.7% kernel / faults: 658 minor
18% 492/system_server: 16% user + 2% kernel / faults: 2093 minor
9.1% 136/mediaserver: 4.9% user + 4.1% kernel / faults: 418 minor
4.9% 133/surfaceflinger: 2% user + 2.9% kernel / faults: 8 minor
2% 145/adbd: 0% user + 2% kernel / faults: 14 minor
1.3% 475/logcat: 0.4% user + 0.8% kernel
1.1% 30/kworker/0:1: 0% user + 1.1% kernel
0.7% 1219/kworker/3:2: 0% user + 0.7% kernel
0% 66/kthread_di: 0% user + 0% kernel
0.1% 70/kthread_h265: 0% user + 0.1% kernel
0.1% 111/avnftl6: 0% user + 0.1% kernel
0% 8/rcu_preempt: 0% user + 0% kernel
0% 71/kworker/u8:1: 0% user + 0% kernel
0% 94/kworker/u8:3: 0% user + 0% kernel
0% 479/aml_buf_toggle: 0% user + 0% kernel
0% 761/com.android.phone: 0% user + 0% kernel / faults: 7 minor
0% 781/com.amlogic.SubTitleService: 0% user + 0% kernel / faults: 32 minor
0% 953/usbtestpm: 0% user + 0% kernel
35% TOTAL: 25% user + 9% kernel + 0% iowait + 0.1% softirq
CPU usage from 1657ms to 2173ms later:
37% 632/com.abc.mainactivity: 31% user + 5.5% kernel / faults: 22 minor
18% 902/emulatorNativeV: 16% user + 1.8% kernel
14% 837/emulatorNativeM: 12% user + 1.8% kernel
1.8% 830/Thread-24: 0% user + 1.8% kernel
1.8% 856/Thread-31: 0% user + 1.8% kernel
1.8% 857/Thread-32: 0% user + 1.8% kernel
+0% 1429/Thread-210: 0% user + 0% kernel
+0% 1430/Thread-211: 0% user + 0% kernel
+0% 1431/Thread-212: 0% user + 0% kernel
+0% 1432/Thread-213: 0% user + 0% kernel
+0% 1433/Thread-214: 0% user + 0% kernel
+0% 1434/Thread-215: 0% user + 0% kernel
+0% 1435/Thread-216: 0% user + 0% kernel
+0% 1436/Thread-217: 0% user + 0% kernel
+0% 1437/Thread-218: 0% user + 0% kernel
+0% 1438/Thread-219: 0% user + 0% kernel
5.6% 492/system_server: 1.8% user + 3.7% kernel
5.6% 506/ActivityManager: 3.7% user + 1.8% kernel
1.3% 30/kworker/0:1: 0% user + 1.3% kernel
1.5% 136/mediaserver: 1.5% user + 0% kernel
1.5% 136/mediaserver: 0% user + 1.5% kernel
1.5% 145/adbd: 0% user + 1.5% kernel
1.5% 148/adbd: 0% user + 1.5% kernel
17% TOTAL: 12% user + 4.2% kernel



请教这种问题如何解决,是否说实现方法不对,个人认为不断的start/stop MP4文件的函数会阻塞其它进程,如会阻塞按键 KEY等,现在我这边没法解决,,,求解决,谢谢啊
...全文
350 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fans_Mo 2017-11-17
  • 打赏
  • 举报
回复
楼主解决了这个问题没有。。。。我也遇到了同样的问题。。。也是无法定位原因,初步估计是这个状态同步问题造成的,具体哪里出现了问题,个人感觉是 stopPlayback 这个导致的,实际 上 到底是不是 并不是很确定。。。
  • 打赏
  • 举报
回复
引用 2 楼 lieri111 的回复:
用mediaplayer 代替一下video view 吧,surfaceview来绘制图像
OK,试一下,谢谢。
  • 打赏
  • 举报
回复
引用 1 楼 wang_qian_kun 的回复:
我有一个治标不治本的思路是这样的:在每次发生点击事件是记录时间time1并将一个boolean值B1的变量赋值为false,在你发送handler的外边加一个if判断,判断B1,再在if前边加一个while判断条件为time1和现在的时间比较,当>2s(自己按照实际设置,此处只是示例),然后将B1赋值true,结束循环,向下执行发送handler方法去播放音乐等。 以上方法为思路,并未验证,楼主可以仅当参考!
谢谢楼上的,按你这思路的话,估计播放会有点延迟,我又想迅速的切换过去....
passself 2017-05-15
  • 打赏
  • 举报
回复
用mediaplayer 代替一下video view 吧,surfaceview来绘制图像
  • 打赏
  • 举报
回复
我有一个治标不治本的思路是这样的:在每次发生点击事件是记录时间time1并将一个boolean值B1的变量赋值为false,在你发送handler的外边加一个if判断,判断B1,再在if前边加一个while判断条件为time1和现在的时间比较,当>2s(自己按照实际设置,此处只是示例),然后将B1赋值true,结束循环,向下执行发送handler方法去播放音乐等。 以上方法为思路,并未验证,楼主可以仅当参考!

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧