0

現在、アプリで ScrictMode を有効にして、UI スレッドでの作業を軽減できる場所を特定しています。現在、新しい FileInputStream インスタンスを作成し、それを使用してデータソースを設定しているときに、onReadFromDisk FileInputStream 違反が発生しています。メディアプレーヤー。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();

私はSOを見て回り、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)

私が間違っていることについて何か考えはありますか?

どうもありがとう。

4

2 に答える 2

4

スレッドを開始するにはstart()、 ではなくを呼び出しますrun()run()現在、現在のスレッドでメソッドを実行しているだけです。

于 2013-07-15T14:29:24.373 に答える
3

start()スレッドが必要です。メインスレッドで呼び出すだけならrun()、すべてメインスレッドで実行されます

于 2013-07-15T14:30:40.410 に答える