2017-09-15 9 views
1

내 앱에서 음악을 재생하려고하는데 미디어 플레이어가로드되는 동안 사용자가 계속 앱을 사용하도록 허용하려고하지만 미디어 플레이어를로드 할 때마다 앱이 몇 초 동안 멈추게됩니다. 미디어 플레이어의 로딩이 끝나면 앱이 정상으로 돌아와 다시 작업하기 시작합니다. 때로는 정지 상태가 아닌 경우도 있으며, 사용자가 앱을 종료하라는 팝업 메뉴가 표시됩니다. 구글이나 유튜브에서 어떤 해결책을 찾을 수 없었습니다. 누군가 내 코드에 문제가 있다는 것을 압니다. 당신이 Handler를 작성하더라도android에서 mediaPlayer를 올바르게 사용하는 방법은 무엇입니까?

final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
      try { 
        String STREAM_URL = #####; // here i put the URL of the song 
        mediaPlayer = new MediaPlayer(); 
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

        try { 
         mediaPlayer.setDataSource(STREAM_URL); 
         mediaPlayer.prepare(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
      } catch (NullPointerException e) { 
       Log.d(TAG, "run: NullPointerException = " + e.getMessage()); 
       FirebaseCrash.log("Tag = " + TAG + "run: NullPointerException = " + e.getMessage()); 
      } 
     } 
    } 
}; 
handler.post(runnable); 
+0

로그를 공유하십시오 –

답변

0

MediaPlayer의 창조는 여전히 메인 UI 스레드에서 발생합니다. prepareAsync으로 전화하거나 AsyncTask 또는 다른 수단을 사용하여 prepare을 주 스레드에 호출하지 않아야합니다. 에서

documentation for Handler : 새 처리기를 만들 때,이 스레드의 스레드/메시지 큐에 바인딩

당신이 음악을 스트리밍하는 경우

를 만드는 재생을 위해 미디어를 준비하는 네트워크는 특히 오래 걸릴 것입니다. 하나의 옵션은 prepareAsync으로 전화하는 것일 수도 있고 prepare을 호출하는 것일 수 있습니다. 이 경우 OnPreparedListener을 설정하고 그 콜백 호출에 start을 설정해야합니다.

+0

prepareAsync를 준비하고 prepareListener를 추가하고 미디어를 시작하려고 시도했지만 앱이 더 이상 붙지 않지만 음악이 재생되지 않습니다 .. 그래서 그것은 또한 내가 핸들러를 올바르게 만들지 않았다고 posibble합니까? 핸들러를 생성하는 올바른 방법은 무엇입니까? – shon

+0

나는'Handler'가 전혀 필요 없다고 생각합니다. 그리고 당신이 제대로 만들어 내지 않았다는 말은 아닙니다. 나는 단지 그것이 당신이 기대 한대로하고 있지 않다고 생각합니다. 'Handler'를 생성하고'Runnable'을 게시함으로써 같은 스레드에서 그 코드를 실행합니다. 단지 약간 늦은 시간에 스레드의 이벤트 루프가 게시 한 이벤트를 처리합니다. – Dave

+0

'MediaPlayer'가 재생되지 않는 한,'OnPreparedListener'에 어떤 로그를 출력하여 호출되고 있는지 확인하고 로그에 경고 나 오류가 없는지 확인하십시오. 질문에있는 코드는'start'를 호출하지 않으므로 이전에 어떻게 사용했는지 모르겠습니다. – Dave