Android关于MediaPlayer中的prepare方法和prepareAsync方法的区别

来源:互联网 发布:js是什么语言 编辑:程序博客网 时间:2024/05/29 11:02
下图是MediaPlayer的生命周期图
prepare方法是将资源同步缓存到内存中,一般加载本地较小的资源可以用这个,如果是较大的资源或者网络资源建议使用prepareAsync方法,异步加载.但如果想让资源启动,即start()起来,因为在异步中,如果不设置监听直接start的话,是拿不到这个资源,如果让线程睡眠一段时间,则可以取得资源,因为这个时候,异步线程已经取得资源,但不可能使用线程睡眠的方式来获取资源啊.所以就需要设置监听事件setOnPreparedListener();来通知MediaPlayer资源已经获取到了,然后实现onPrepared(MediaPlayer mp)方法.在里面启动MediaPlayer

实例代码如下,SurfaceView+MediaPlayer播放视频,

package com.kira.surfaceviewforvideo;import java.io.File;import java.io.IOException;import android.app.Activity;import android.media.MediaPlayer;import android.media.MediaPlayer.OnPreparedListener;import android.os.Bundle;import android.os.Environment;import android.os.SystemClock;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;public class MainActivity extends Activity implements Callback,OnPreparedListener {private SurfaceView sv;private SurfaceHolder holder1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sv = (SurfaceView) findViewById(R.id.surface);holder1 = sv.getHolder();holder1.addCallback(this);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stub// 播放视频MediaPlayer media = new MediaPlayer();// 缓存到内存File file = new File(Environment.getExternalStorageDirectory(),"oppo.3gp");try {media.setDataSource(file.getAbsolutePath());// 异步缓存到内存// media.prepare();media.prepareAsync();//SystemClock.sleep(5000); // 若让其睡眠5秒钟,则可以prepareAsync可以取到资源media.setOnPreparedListener(this);// media.prepare();media.setDisplay(holder);media.start();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stub}@Overridepublic void onPrepared(MediaPlayer mp) {// TODO Auto-generated method stub mp.start();}}


0 0