2011-12-30 3 views
1

음악을 재생하는 정적 메소드가 있습니다. 재생이 완료되면이 메서드에서 값을 반환하는 방법? 당신이 결과를 반환해야하는 경우리스너의 반환 값

public static int playSample(Context context, int resid) { 
    AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid); 

    try { 
     mediaPlayer.reset(); 
     mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); 
     mediaPlayer.prepare(); 
     mediaPlayer.start(); 
     mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      public void onCompletion(MediaPlayer mediaPlayer) { 
       // from here i want return some value that play is completed 
      } 
     }); 
     afd.close(); 
    } catch (IllegalArgumentException e) { 
     Log.e("a", "Unable to play audio queue do to exception: " + e.getMessage(), e); 
    } catch (IllegalStateException e) { 
     Log.e("a", "Unable to play audio queue do to exception: " + e.getMessage(), e); 
    } catch (IOException e) { 
     Log.e("a", "Unable to play audio queue do to exception: " + e.getMessage(), e); 
    } 
} 

답변

1

OnCompletionListener을 정적 함수에 '콜백'으로 전달하지 않는 이유는 무엇입니까? MediaPlayer를 개체 경우에 OnCompletionListener 당신이 모든 경우에 콜백을 걱정하지 않는 경우

StaticActivity.playSample(this, R.id.random, new MediaPlayer.OnCompletionListener() { 
    public void onCompletion(MediaPlayer mediaPlayer) { 
     // do something when playing completes 
    } 
} 

, 당신은 아마 null를 제공 할 수 있습니다 만 설정 :

public static int playSample(Context context, int resid, MediaPlayer.OnCompletionListener callback) { 
    //... 
    mediaPlayer.setOnCompletionListener(callback); 
} 

는 다음과 같은 기능을 사용 그것은 null이 아닙니다.

1
public class MediaListener implements MediaPlayer.OnCompletedListener{ 

    public static final int PLAY_COMPLETED = 12345 

    public MediaListener(){} 
    public int Indicator = 0 

    public void onCompletion(MediaPlayer mediaPlayer) { 
     Indicator = PLAY_COMPLETED 
    } 
} 

... 
MediaListener ml = new MediaListener(); 
mediaPlayer.setOnCompletionListener(ml); 
//check ml.Indicator 

의 안 좋은 코딩 스타일하지만,이 같은 busyWait 수 있습니다 : 정적 메소드는 UI에서 호출되는 경우

while(ml.Inidcator != PLAY_COMPLETED){ 
    sleep(50) // 
} 

의미 실이 끝날 때까지 실을 차단합니다.

0

onCompletion 메서드는 비동기 적으로 호출됩니다. 반환 값 대신이 메서드에서 다음 음악을 재생하는 것과 같은 원하는 작업을 수행 할 수 있습니다.

0

반환 된 값으로 무엇을 하시겠습니까? 완성 된 리스너에서 외부 메소드를 호출하는 코드를 배치하십시오. 이 외부 메서드가 '반환'값을 처리하도록 하시겠습니까?