Java 从侦听器返回值

Java 从侦听器返回值,java,android,Java,Android,我有播放音乐的静态方法。播放完成后,如何从该方法返回值 public static int playSample(Context context, int resid) { AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid); try { mediaPlayer.reset(); mediaPlayer.setDataSource(afd.getFil

我有播放音乐的静态方法。播放完成后,如何从该方法返回值

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);
    }
}
这不是一种好的编码方式,但如果您希望在那里返回结果,您可以像这样忙碌地等待:

while(ml.Inidcator != PLAY_COMPLETED){
    sleep(50) //
}
StaticActivity.playSample(this, R.id.random, new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mediaPlayer) {
        // do something when playing completes
    }
}
这意味着,如果从UI线程调用静态方法,它将阻止任何操作,直到播放完成

这不是一种好的编码方式,但如果您希望在那里返回结果,您可以像这样忙碌地等待:

while(ml.Inidcator != PLAY_COMPLETED){
    sleep(50) //
}
StaticActivity.playSample(this, R.id.random, new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mediaPlayer) {
        // do something when playing completes
    }
}

这意味着如果从UI线程调用静态方法,它将阻止任何内容,直到播放完成。

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

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

你想用返回值做什么?在完成时侦听器中,放置调用外部方法的代码。让此外部方法处理“返回”值

您希望如何处理返回的值?在完成时侦听器中,放置调用外部方法的代码。让此外部方法处理“return”值

为什么不将一个
OnCompletionListener
作为“回调”传递给静态函数

public static int playSample(Context context, int resid, MediaPlayer.OnCompletionListener callback) {
    //...
    mediaPlayer.setOnCompletionListener(callback);
}
然后使用如下函数:

while(ml.Inidcator != PLAY_COMPLETED){
    sleep(50) //
}
StaticActivity.playSample(this, R.id.random, new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mediaPlayer) {
        // do something when playing completes
    }
}

如果您在所有情况下都不关心回调,那么您可能只需要提供
null
,并且仅在MediaPlayer对象上设置OnCompletionListener(如果它不是
null

),为什么不将
OnCompletionListener
作为“回调”传递给静态函数呢

public static int playSample(Context context, int resid, MediaPlayer.OnCompletionListener callback) {
    //...
    mediaPlayer.setOnCompletionListener(callback);
}
然后使用如下函数:

while(ml.Inidcator != PLAY_COMPLETED){
    sleep(50) //
}
StaticActivity.playSample(this, R.id.random, new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mediaPlayer) {
        // do something when playing completes
    }
}
如果您不关心所有情况下的回调,您可能只需要提供
null
,并且仅在MediaPlayer对象上设置OnCompletionListener(如果它不是
null