Mediaplayer新手问题
我写了个视频播放器,要求是一直循环播放文件夹下的所有视频,但我这个播放器循环播一段时间后就停了,有时还死机,我写了个log看了下,内存从刚开始的200多M,到最后的10M,我找了很久也找不出我这播放器哪耗内存啊,请各位高手帮我看看我代码哪里不写的不好
package ycq.informationPublish;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import ycq.informationPublish.filehandle.PropertiesFile;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Debug.MemoryInfo;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.TextView;
import android.widget.Toast;
public class MediaActivity extends Activity implements SurfaceHolder.Callback,MediaPlayer.OnPreparedListener
{
/** Called when the activity is first created. */
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
MediaPlayer mMediaPlayer;
private List<String> listVideo=new ArrayList<String>();
int video=0;
private int videoWidth;
private int videoHeight;
private MyReceiver receiver;
String path="/mnt/flash/video";
// String path="/sdcard/video";
PropertiesFile pro=new PropertiesFile();
BufferedWriter bos;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.media);
receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MY_VIDEO");
//注册
registerReceiver(receiver, filter);
surfaceView = (SurfaceView)findViewById(R.id.videoView);
surfaceHolder = surfaceView.getHolder();
mMediaPlayer = new MediaPlayer();
path=pro.getPath(); //获得视频文件路径
surfaceHolder.addCallback(this);
surfaceHolder.setFixedSize(480,800);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//log的存储位置
File log=new File("/mnt/flash/log.txt");
if(log.exists())
{
log=new File("/mnt/flash/log1.txt");
}
try {
bos= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(log)));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
writeToFile("start mediaActivity");//调用写log的方法
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode == KeyEvent.KEYCODE_BACK)
{
mMediaPlayer.stop();
mMediaPlayer.release();
unregisterReceiver(receiver);
MediaActivity.this.finish();
return true;
}//System.exit(0);
return super.onKeyDown(keyCode, event);
}
//获得视频列表
public void getFileName(String path)
{
try{
File file=new File(path);
File [] file_list=file.listFiles();
if(file_list!=null)
{
for(int i=0;i<file_list.length;i++)
{
File f=file_list[i];
listVideo.add(f.getName().toString());
}
file_list=null;
}
}catch(Exception e){
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
getFileName(path);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnCompletionListener(
new MediaPlayer.OnCompletionListener()
{
// @Override
/*覆盖文件播出完毕事件*/
public void onCompletion(MediaPlayer arg0)
{
//checkError=0;
writeToFile("end media:"+listVideo.get(video));
try
{
if(listVideo.size()!=0)
{
video++; //下一个视屏文件
if(video>=listVideo.size())
{
video=0;
}
player();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
/* 当MediaPlayer.OnErrorListener会运行的Listener */
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener()
{
@Override
/*覆盖错误处理事件*/
public boolean onError(MediaPlayer arg0, int arg1, int arg2)
{
// TODO Auto-generated method stub
writeToFile("error media:"+listVideo.get(video));
if(listVideo.size()==0)//但checkError大于listVideo.size()说明所有文件都是不可播放的
{
if(mMediaPlayer!=null&&mMediaPlayer.isPlaying())
{
mMediaPlayer.stop();
}
Toast.makeText(MediaActivity.this,"无可播放视频文件,请上传可播放视频",Toast.LENGTH_LONG).show();
}else
{
try{
String name_video=listVideo.get(video);
Toast.makeText(MediaActivity.this,name_video+"视频不能播放,请删除",Toast.LENGTH_SHORT).show();
listVideo.remove(video);
}catch(OutOfMemoryError e)
{
System.gc();
}catch(Exception e)
{
System.gc();
}
try
{
if(video>=listVideo.size())//当错误文件时最后一个文件时,就播放第一个文件
{
video=0;
}
if(listVideo.size()==0)
{
if(mMediaPlayer!=null&&mMediaPlayer.isPlaying())
{
mMediaPlayer.stop();
}
Toast.makeText(MediaActivity.this,"无可播放视频文件,请上传可播放视频",Toast.LENGTH_LONG).show();
}else
{
player();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
return true;
}
});
if(listVideo.size()!=0)
{
player();
}else
{
mMediaPlayer.stop();
Toast.makeText(MediaActivity.this,"无可播放视频文件,请上传可播放视频",Toast.LENGTH_LONG).show();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void onPrepared(MediaPlayer mp) {
//TODO Auto-generated method stub
this.videoWidth = this.mMediaPlayer.getVideoWidth();
this.videoHeight = this.mMediaPlayer.getVideoHeight();
if (this.videoHeight != 0 && this.videoWidth != 0) {
this.surfaceHolder.setFixedSize(this.videoWidth, this.videoHeight);
// mp.start();
}
this.surfaceHolder.setFixedSize(780,780);
writeToFile("start media:"+listVideo.get(video));
mMediaPlayer.start();
}
//接收广播
private class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
int check = bundle.getInt("check");
if(check==1)
{
//mMediaPlayer.stop();
path=pro.getPath();
listVideo.clear();
getFileName(path);//得到所有文件
video=0;
try{
if(listVideo!=null&&listVideo.size()!=0)
{
player();
}else
{
if(path.equals("/mnt/flash/video"))//路径下视频为空就转变路径
{
path="/sdcard/video";
}else
{
path="/mnt/flash/video";
}
listVideo.clear();
getFileName(path);
if(listVideo!=null&&listVideo.size()!=0)
{
player();
}else
{
if(mMediaPlayer.isPlaying())
{
mMediaPlayer.stop();
}
Toast.makeText(MediaActivity.this,"无可播放视频文件,请上传可播放视频",Toast.LENGTH_LONG).show();
}
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
}
//播放器的设置
public void player()
{
if(mMediaPlayer!=null)
{
mMediaPlayer.stop();
}
System.gc();
mMediaPlayer.reset();
mMediaPlayer.setDisplay(surfaceHolder);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mMediaPlayer.setDataSource(path+"/"+listVideo.get(video));
mMediaPlayer.prepareAsync();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
[解决办法]
这么耗时的操作楼主请多开几个线程。。你这样写,容易卡死。
[解决办法]
最少可以开4-5个线程。。楼主优化下代码吧
[解决办法]
比如说:你获取手机中的所有视频文件。这可以单独开一个线程。在比如说你播放视频这也是一个线程。反正你觉得会影响效率的操作都可以单独开线程。比如视频播放时间显示什么的。又是一个线程了。你可以把每个小模块都分开操作。
[解决办法]
MediaPlayer.OnCompletionListener
在里边release了
[解决办法]
LZ在播放结束后没有释放调media player占有的资源,而是继续加载媒体资源进行播放,最后肯定会耗光内存。
下面是我写的音乐播放器停止的方法,将media player先停止,然后释放资源,置空,下次播放是重新new一个对象就好
- Java code
private void stopMediaPlayer() { if (mMiniMediaPlayer != null) { mMiniMediaPlayer.stop(); mMiniMediaPlayer.release(); mMiniMediaPlayer = null; } }
[解决办法]
import ycq.informationPublish.filehandle.PropertiesFile;
楼主,你这条语句里面类的编写是怎么样的吖?