在主线程上使用setDataSource真的无效吗?

时间:2012-12-14 20:45:08

标签: android android-mediaplayer

我最近注意到我在Android Developer Console中收到了以下崩溃的报告:

android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
at java.net.InetAddress.getHostByAddrImpl(InetAddress.java:440)
at java.net.InetAddress.getHostName(InetAddress.java:313)
at android.media.MediaPlayer.checkHostdata(MediaPlayer.java:869)
at android.media.MediaPlayer.isLocalhost(MediaPlayer.java:940)
at android.media.MediaPlayer.setDataSourceBase(MediaPlayer.java:980)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1085)
[the rest is irrelevant]

似乎在MediaPlayer.setDataSource方法的某处,有一些代码触及网络,导致StrictMode吠叫。这有点令人惊讶,因为在主线程上调用setDataSource似乎是常见的做法。

所以我的问题是,处理这个问题的最佳方法是什么?我应该将mediaPlayer移出主线程吗?我应该忽略它吗?或者,别的什么?

1 个答案:

答案 0 :(得分:3)

嗯,从战略上讲,这感觉就像是StrictMode逻辑上过于激进的一点,如果getHostByAddrImpl()真的没有做阻塞的风险,那么未来可能会得到修复网络I / O呼叫。

从战术上讲,您应该将setDataSource()调用移至后台线程,尤其是当源指向网络时(httprtsp等)。