2011-12-30 38 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作为“回调”传递给静态函数?

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

然后使用这样的功能:

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

如果你不关心在所有情况下的回调,你可能只提供null,只设置OnCompletionListener的MediaPlayer对象,如果上这不是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这样的:

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

这意味着,如果你的静态方法从UI叫线程它将阻止任何东西,直到完成播放。

0

我认为这是没有返回值的好方法,该onCompletion方法异步调用,你可以做的事情,你想如播放下一首音乐在这个方法,而不是通过返回值。

0

你想用返回的值做什么?在完成监听器中,放置代码以调用外部方法。使用此外部方法处理'返回'值