java - AndroidBlockGuardPolicy.onReadFromDisk FileInputStream 违规

标签 java android android-mediaplayer fileinputstream android-strictmode

我目前在我的应用程序中启用了 ScrictMode,以确定在哪里可以减轻 UI 线程上的工作,并且当我创建新的 FileInputStream 实例然后使用它来设置时,我当前遇到了 onReadFromDisk FileInputStream 违规我的 MediaPlayer 的数据源。我创建了一个单独的线程来将文件加载到 FileInputStream 实例中并设置 MediaPlayer 的数据源,但当我尝试创建 FileInputStream 实例时,ScrictMode 仍然报告存在 onReadFromDisk 违规。代码如下:

final Handler uiHandler = new Handler(Looper.getMainLooper());

Thread loadInputStream = new Thread(new Runnable() {

                @Override
                public void run() {

                    try {

                        if (m_mediaPlayer == null)
                            m_mediaPlayer = new MediaPlayer();

                        FileInputStream fileInputStream = new FileInputStream(path);
                        m_mediaPlayer.setDataSource(fileInputStream.getFD());

                        fileInputStream.close();

                        m_mediaPlayer.setOnErrorListener(MainActivity.this);
                        m_mediaPlayer.setOnPreparedListener(MainActivity.this);
                        m_mediaPlayer.setOnCompletionListener(MainActivity.this);

                        m_mediaPlayer.prepare();

                    } catch (final Exception e) {

                        uiHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                LogException(e.getMessage() + " (path == " + path + ")", "playVideo()");
                            }                           
                        });
                    }
                }               
            }); 


loadInputStream.run();

我环顾四周,发现另一篇文章表明我应该重置 StrictMode 线程策略 - 我尝试过,但我仍然收到该违规报告。

这就是 LogCat ScrictMode 报告的样子:

at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1107)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:106)
at libcore.io.IoBridge.open(IoBridge.java:400)
at java.io.FileInputStream.<init>(FileInputStream.java:78)
at java.io.FileInputStream.<init>(FileInputStream.java:105)
at com.subdc.subdcmain.MainActivity$6.run(MainActivity.java:440)
at java.lang.Thread.run(Thread.java:856)
at com.subdc.subdcmain.MainActivity.playVideo(MainActivity.java:467)

知道我出了什么问题吗?

非常感谢。

最佳答案

要启动线程,请调用 start(),而不是 run()。现在,您只是在当前线程上运行 run() 方法。

关于java - AndroidBlockGuardPolicy.onReadFromDisk FileInputStream 违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17656584/

相关文章:

Android MediaPlayer/VideoView 错误 (1, -2147483648)

android - 转换期间 jQuery Mobile 屏幕闪烁

java - 如何在 ScrollView 和 LinearLayout 中居中

android - "text selection mode"是否对所有 View 和设备都一样工作

Android MediaPlayer 无法使用 Uri.parse '#' 播放文件名中包含 ("...#.mp3"字符的文件)

java - Scanner input = new Scanner(System.in) 到底是什么意思?

java - 为什么 Jdk DateFormat 使用 StringBuffer 而不是 StringBuilder?

java - Java 如何从整个数据库中导出数据?

java - 使用 Apache POI 识别 MS Excel 中的要点

android - Android播放多种声音