2013-10-08 2 views
0

다양한 짧은 음악 파일을 서로 재생해야하는 Android 용 앱을 디자인하고 있습니다.Android 상호 작용 - 음악

이러한 사운드 파일을 반복 재생하는 루프를 실행하기 위해 "onClick"수신기를 설정 했으므로 100 번 이상 재생할 수 있습니다.

하지만

이 나는 ​​음악 파일 재생이 완료 될 때까지 시간이 순간에, 루프가 실행하고는 기본적으로 장치가 얼어 수없는, 재생되는 동안 응용 프로그램과 상호 작용 할 수 있도록 사용자가 필요합니다 .

유용한 해결책을 알려주는 포인터가 있습니까?

루프는 기본적으로 :

mPlayButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public synchronized void onClick(View v) { 

      for(char i: method.toCharArray()){ 
       mPlayer.play(getActivity(),Integer.parseInt(Character.toString(i))); 
       try { 
        wait(500); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 

     } 
    }); 
+0

아래에 게시 된 서비스 아이디어는 합리적이지만 더 큰 문제가있는 것 같아요. 기본적으로 서비스는 동일한 스레드에서 실행되므로 정리할 때까지 도움이되지 않을 수 있습니다. while 루프를 게시 할 수 있습니까? – Dave

+0

내림차순으로 편집 됨 –

답변

2

당신은 배경 음악을 재생하는 서비스를 사용 할 수 있습니다.

다음은이 작업을 수행하는 방법에 대한 훌륭한 자습서입니다. LINK.

뭔가 this 같은 :

시작이 당신은 음악을 연주 할 때

Intent svc=new Intent(this, BackgroundSoundService.class); 
startService(svc); 

을 그리고 프로젝트에 새로운 서비스 파일을 만듭니다

public class BackgroundSoundService extends Service { 
    private static final String TAG = null; 
    MediaPlayer player; 
    public IBinder onBind(Intent arg0) { 

     return null; 
    } 
@Override 
public void onCreate() { 
    super.onCreate(); 
    player = MediaPlayer.create(this, R.raw.idil); 
    player.setLooping(true); // Set looping 
    player.setVolume(100,100); 

} 
public int onStartCommand(Intent intent, int flags, int startId) { 
    player.start(); 
    return 1; 
} 

public void onStart(Intent intent, int startId) { 
    // TO DO 
} 
public IBinder onUnBind(Intent arg0) { 
    // TO DO Auto-generated method 
    return null; 
} 

public void onStop() { 

} 
public void onPause() { 

} 
@Override 
public void onDestroy() { 
    player.stop(); 
    player.release(); 
} 

@Override 
public void onLowMemory() { 

} 
} 
1

하는 난 단지 추측 할 수 질문에 코드를 첨부하지 않았으므로 응용 프로그램의 기본 스레드 인 UI 스레드에서 실행되는 루프를 구현 한 것처럼 들립니다. 한 스레드가 한 번에 한 줄의 코드 만 실행할 수 있고 코드를 병렬로 실행할 수 없기 때문에 응용 프로그램이 고정 된 것처럼 보입니다. 음악 재생을위한 루프가 실행되는 다른 스레드를 만드는 것입니다. 이를 달성하는 다양한 방법이 있습니다. 서비스 구현을 시도해야한다고 생각합니다. 서비스를 통해 다른 스레드에서 코드를 실행할 수 있으며 서비스와 쉽게 통신 할 수 있습니다. 음악 재생을 시작하거나 중지 할 수 있습니다. 서비스에 대한 자세한 내용은 다음을 참조하십시오. http://developer.android.com/reference/android/app/Service.html Google에서 Android 서비스 자습서를 검색 할 수도 있습니다. 웹에 많은 정보가 있습니다. 행운을 빕니다!

+0

보낸 페이지를 보면 사용자가 상호 작용하지 않는 백그라운드 작업에 사용된다는 메시지가 표시되어 사용자가 실행 중일 때 상호 작용할 수 있기를 바랍니다. 서비스가 올바른 것입니까? –

1

먼저, 잠자기는 MediaPlayer에 설정할 수있는 onCompletionListener가 있기 때문에 여기에서 타이밍을 제어하는 ​​방법이 아닙니다. 리소스 사용에주의를 기울이면 setNextMediaPlayer 메서드도 있습니다 (MediaPlayers를 여러 개 만들어서 모두 준비 할 수는 없습니다).

둘째, 별도의 스레드 또는 AsyncTask (새 스레드를 생성 함)가 필요합니다. 서비스는 사용자가 별도로 지정하지 않는 한 UI와 동일한 스레드에서 실행되며 대부분 불필요한 복잡성 계층을 추가합니다.

마지막으로 SoundPool을 사용하는 것이 좋습니다.