【问题标题】:AndroidBlockGuardPolicy.onReadFromDisk FileInputStream ViolationAndroidBlockGuardPolicy.onReadFromDisk FileInputStream 违规
【发布时间】:2013-07-15 14:24:42
【问题描述】:

我目前在我的应用程序中启用了 ScrictMode 以确定我可以在哪里减轻 UI 线程上的工作,并且当我创建一个新的 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)

知道我哪里出错了吗?

非常感谢。

【问题讨论】:

    标签: java android android-mediaplayer fileinputstream android-strictmode


    【解决方案1】:

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

    【讨论】:

    • 感谢墨菲先生的及时回复,我已经接受了迈克尔的回答,因为他先到了那里:)。 (感谢令人敬畏的 GitHub 存储库,我从他们那里学到了很多东西)
    • @tony:“我已经接受了迈克尔的回答,因为他先到了那里”——没问题。 “感谢出色的 GitHub 存储库”——不客气!
    • 看起来@CommonsWare 是第一个到达那里的?
    【解决方案2】:

    您必须start() 线程。如果你只是在主线程中调用run(),一切都会在主线程中执行

    【讨论】:

    • 非常感谢您的及时回复,迈克尔。做到了:)
    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2021-02-26
    • 2012-11-25
    • 2016-01-30
    • 2020-12-24
    相关资源
    最近更新 更多