2011-12-30 36 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

你想用返回的值做什麼?在完成監聽器中,放置代碼以調用外部方法。使用此外部方法處理'返回'值