通過執行個體驗證MediaPlayer的reset函數並不會阻塞主線程

來源:互聯網
上載者:User

如題,通過下面的一個例子,頻繁點擊播放下一首歌,驗證MediaPlayer的reset函數是否會發生阻塞。

驗證資料如下:在從20:26:04.673到20:26:36.168的32秒時間內,點擊170次Next播放下一首歌曲,都成功,沒有發生阻塞主線程導致ANR的問題。

由於本例播放的都是本地歌曲 ,所以沒有發生阻塞的情況。如果是播放線上歌曲,需要與網路交換,頻繁執行播放動作,可能會發生ANR;播放網路歌曲需要使用非同步prepareAsync函數,而不能使用同步的prepare,以免發生阻塞。

(1)第一次播放的log如下:

06-24 20:26:04.673 26426 26426 D MainActivity: -------------------------------
06-24 20:26:04.678 26426 26426 D MainActivity: play next music
06-24 20:26:04.678 26426 26426 D MainActivity: before reset
06-24 20:26:04.683 26426 26426 D MainActivity: after reset
06-24 20:26:04.683 26426 26426 D MainActivity: before setDataSource:/mnt/sdcard/Music/白安/麥田捕手-白安.mp3
06-24 20:26:04.763 26426 26426 D MainActivity: after setDataSource to prepare
06-24 20:26:04.768 26426 26426 D MainActivity: onPrepared
06-24 20:26:04.898 26426 26426 D MainActivity: -------------------------------

(2)最後6次播放的log如下:

06-24 20:26:35.013 26426 26426 D MainActivity: -------------------------------
06-24 20:26:35.013 26426 26426 D MainActivity: play next music
06-24 20:26:35.013 26426 26426 D MainActivity: before reset
06-24 20:26:35.018 26426 26426 D MainActivity: after reset
06-24 20:26:35.018 26426 26426 D MainActivity: before setDataSource:/mnt/sdcard/Music/Download/餘生一起過-劉德華.aac
06-24 20:26:35.068 26426 26426 D MainActivity: after setDataSource to prepare
06-24 20:26:35.073 26426 26426 D MainActivity: onPrepared
06-24 20:26:35.213 26426 26426 D MainActivity: -------------------------------
06-24 20:26:35.213 26426 26426 D MainActivity: play next music
06-24 20:26:35.213 26426 26426 D MainActivity: before reset
06-24 20:26:35.218 26426 26426 D MainActivity: after reset
06-24 20:26:35.218 26426 26426 D MainActivity: before setDataSource:/mnt/sdcard/Music/白安/麥田捕手-白安.mp3
06-24 20:26:35.298 26426 26426 D MainActivity: after setDataSource to prepare
06-24 20:26:35.308 26426 26426 D MainActivity: onPrepared
06-24 20:26:35.403 26426 26426 D MainActivity: -------------------------------
06-24 20:26:35.403 26426 26426 D MainActivity: play next music
06-24 20:26:35.403 26426 26426 D MainActivity: before reset
06-24 20:26:35.403 26426 26426 D MainActivity: after reset
06-24 20:26:35.403 26426 26426 D MainActivity: before setDataSource:/mnt/sdcard/Music/Download/幸福就是-劉若英.mp3
06-24 20:26:35.463 26426 26426 D MainActivity: after setDataSource to prepare
06-24 20:26:35.463 26426 26426 D MainActivity: onPrepared
06-24 20:26:35.593 26426 26426 D MainActivity: -------------------------------
06-24 20:26:35.593 26426 26426 D MainActivity: play next music
06-24 20:26:35.593 26426 26426 D MainActivity: before reset
06-24 20:26:35.598 26426 26426 D MainActivity: after reset
06-24 20:26:35.598 26426 26426 D MainActivity: before setDataSource:/mnt/sdcard/Music/Download/餘生一起過-劉德華.aac
06-24 20:26:35.678 26426 26426 D MainActivity: after setDataSource to prepare
06-24 20:26:35.683 26426 26426 D MainActivity: onPrepared
06-24 20:26:35.983 26426 26426 D MainActivity: -------------------------------
06-24 20:26:35.983 26426 26426 D MainActivity: play next music
06-24 20:26:35.983 26426 26426 D MainActivity: before reset
06-24 20:26:35.983 26426 26426 D MainActivity: after reset
06-24 20:26:35.983 26426 26426 D MainActivity: before setDataSource:/mnt/sdcard/Music/白安/麥田捕手-白安.mp3
06-24 20:26:36.068 26426 26426 D MainActivity: after setDataSource to prepare
06-24 20:26:36.073 26426 26426 D MainActivity: onPrepared
06-24 20:26:36.168 26426 26426 D MainActivity: -------------------------------
06-24 20:26:36.168 26426 26426 D MainActivity: play next music
06-24 20:26:36.168 26426 26426 D MainActivity: before reset
06-24 20:26:36.173 26426 26426 D MainActivity: after reset
06-24 20:26:36.173 26426 26426 D MainActivity: before setDataSource:/mnt/sdcard/Music/Download/幸福就是-劉若英.mp3
06-24 20:26:36.238 26426 26426 D MainActivity: after setDataSource to prepare
06-24 20:26:36.243 26426 26426 D MainActivity: onPrepared

(3)執行reset前後的log如下,reset在極短的時間內就會執行完畢,一般在10毫秒以內。

3:06-24 20:26:04.678 26426 26426 D MainActivity: before reset
4:06-24 20:26:04.683 26426 26426 D MainActivity: after reset
10:06-24 20:26:04.898 26426 26426 D MainActivity: before reset
11:06-24 20:26:04.898 26426 26426 D MainActivity: after reset
17:06-24 20:26:05.063 26426 26426 D MainActivity: before reset
18:06-24 20:26:05.068 26426 26426 D MainActivity: after reset
24:06-24 20:26:05.243 26426 26426 D MainActivity: before reset
25:06-24 20:26:05.243 26426 26426 D MainActivity: after reset
31:06-24 20:26:05.578 26426 26426 D MainActivity: before reset
32:06-24 20:26:05.583 26426 26426 D MainActivity: after reset
38:06-24 20:26:05.758 26426 26426 D MainActivity: before reset
39:06-24 20:26:05.763 26426 26426 D MainActivity: after reset
45:06-24 20:26:05.918 26426 26426 D MainActivity: before reset
46:06-24 20:26:05.918 26426 26426 D MainActivity: after reset
52:06-24 20:26:06.098 26426 26426 D MainActivity: before reset
53:06-24 20:26:06.098 26426 26426 D MainActivity: after reset
......

1144:06-24 20:26:34.838 26426 26426 D MainActivity: before reset
1145:06-24 20:26:34.838 26426 26426 D MainActivity: after reset
1151:06-24 20:26:35.013 26426 26426 D MainActivity: before reset
1152:06-24 20:26:35.018 26426 26426 D MainActivity: after reset
1158:06-24 20:26:35.213 26426 26426 D MainActivity: before reset
1159:06-24 20:26:35.218 26426 26426 D MainActivity: after reset
1165:06-24 20:26:35.403 26426 26426 D MainActivity: before reset
1166:06-24 20:26:35.403 26426 26426 D MainActivity: after reset
1172:06-24 20:26:35.593 26426 26426 D MainActivity: before reset
1173:06-24 20:26:35.598 26426 26426 D MainActivity: after reset
1179:06-24 20:26:35.983 26426 26426 D MainActivity: before reset
1180:06-24 20:26:35.983 26426 26426 D MainActivity: after reset
1186:06-24 20:26:36.168 26426 26426 D MainActivity: before reset
1187:06-24 20:26:36.173 26426 26426 D MainActivity: after reset

(4)驗證代碼如下:

public class MainActivity extends Activity implements View.OnClickListener{    private static final String TAG = "MainActivity";    private MediaPlayer mMediaPlayer = null;    private Button mBtnPlayStop;    private Button mBtnNext;        private boolean mIsPlayFlag = false;        private String mPathArray[] = new String[] {      "/mnt/sdcard/Music/白安/麥田捕手-白安.mp3",      "/mnt/sdcard/Music/Download/幸福就是-劉若英.mp3",      "/mnt/sdcard/Music/Download/餘生一起過-劉德華.aac"    };    private int mIndex = 0;    public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                mBtnPlayStop = (Button)findViewById(R.id.btnPlayStop);        mBtnPlayStop.setOnClickListener(this);                mBtnNext = (Button)findViewById(R.id.btnNext);        mBtnNext.setOnClickListener(this);                setVolumeControlStream(AudioManager.STREAM_MUSIC);        mMediaPlayer = new MediaPlayer();        mMediaPlayer.setOnPreparedListener(new OnPreparedListener() {            @Override            public void onPrepared(MediaPlayer arg0) {                Log.d(TAG, "onPrepared");                mMediaPlayer.start();            }                    });        mMediaPlayer.setOnCompletionListener(new OnCompletionListener()        {            @Override            public void onCompletion(MediaPlayer mp)            {                Log.d(TAG, "onCompletion");                next();            }        });        mMediaPlayer.setOnErrorListener(new OnErrorListener() {            @Override            public boolean onError(MediaPlayer mp, int what, int extra) {                Log.d(TAG, "onError what:" + what + ", extra:" + extra);                                return false;            }                    });    }    @Override    public void onClick(View v) {        switch (v.getId())          {          case R.id.btnPlayStop:            if (mIsPlayFlag) {                try {                    Log.d(TAG,"-------------------------------");                    Log.d(TAG, "play:" + mPathArray[mIndex]);                    Log.d(TAG, "before reset");                    mMediaPlayer.reset();                    Log.d(TAG, "after reset");                                        Log.d(TAG, "before setDataSource");                    mMediaPlayer.setDataSource(mPathArray[mIndex]);                    Log.d(TAG, "after setDataSource to prepare");                    mMediaPlayer.prepare();                } catch (Exception e) {                    e.printStackTrace();                }                mBtnPlayStop.setText("Stop");            } else {                Log.d(TAG,"-------------------------------");                Log.d(TAG, "stop" + mPathArray[mIndex]);                mMediaPlayer.stop();                mBtnPlayStop.setText("Play");            }                        mIsPlayFlag = !mIsPlayFlag;            break;        case R.id.btnNext:            Log.d(TAG,"-------------------------------");            Log.d(TAG, "play next music");            next();            break;        }      }     private void next() {        try {            Log.d(TAG, "before reset");            mMediaPlayer.reset();            Log.d(TAG, "after reset");                        if (mIndex < mPathArray.length - 1) {                mIndex++;            } else {                mIndex = 0;            }            Log.d(TAG, "before setDataSource:" + mPathArray[mIndex]);            mMediaPlayer.setDataSource(mPathArray[mIndex]);            Log.d(TAG, "after setDataSource to prepare");            mMediaPlayer.prepare();        } catch (Exception e) {            e.printStackTrace();        }    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.