0

현재 응용 프로그램에서 UI 스레드에서 작업을 완화 할 수있는 위치를 결정하기 위해 ScrictMode가 활성화되어 있고 새로운 FileInputStream 인스턴스를 만들 때 현재 onReadFromDisk FileInputStream Violation을 얻고 있습니다. 그것을 사용하여 내 MediaPlayer의 데이터 소스를 설정합니다. FileInputStream 인스턴스로 파일을로드하고 MediaPlayer의 데이터 소스를 설정하기 위해 별도의 스레드를 만들었지 만 FileInputStream 인스턴스를 만들 때 ScReadMode가 여전히 onReadFromDisk 위반을보고합니다. - 내가 시도하지만 난 아직도 그 위반의 보고서를 얻고있다AndroidBlockGuardPolicy.onReadFromDisk FileInputStream 위반

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 스레드 정책을 다시한다고 표시 다른 게시물을 발견했습니다 다음과 같이 코드입니다. 내가 잘못거야 무엇으로

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) 

어떤 생각 :

이는 로그 캣 ScrictMode 보고서는 모습입니다?

감사합니다.

답변

1

스레드가 start()이어야합니다. 주 스레드에서 run()을 호출하면 모든 것이 메인 스레드에서 실행됩니다.

+0

신속한 답변을 해주셔서 대단히 감사합니다, 마이클. 그랬어 :) – tony

3

스레드를 시작하려면 run()이 아니라 start()으로 전화하십시오. 지금 당장은 현재 스레드에서 run() 메서드를 실행하고 있습니다.

+0

신속한 응답 주셔서 감사합니다. Mr Murphy, 저는 Michael이 처음에 거기에있는 것처럼 대답을 수락했습니다. :) (그리고 멋진 GitHub repos에 감사드립니다. 나는 그들에게서 미친 양을 배웠습니다.) – tony

+0

@tony : "Michael이 처음에 거기에있는 것처럼 대답을 받아 들였습니다."- 문제 없습니다. "그리고 멋진 GitHub repos"에 감사드립니다 - 당신은 매우 환영합니다! – CommonsWare

+2

@CommonsWare가 먼저 도착한 것 같습니다. – Marty