我写了个视频播放器,要求是一直循环播放文件夹下的所有视频,但我这个播放器循环播一段时间后就停了,有时还死机,我写了个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();
       
}  


 }

解决方案 »

  1.   

    接上
     //写log方法
     private void writeToFile(String vlaue) {  SimpleDateFormat    formatter    =   new    SimpleDateFormat("yyyy/MM/dd/HH:mm:ss");      
     Date    curDate    =   new    Date(System.currentTimeMillis());//获取当前时间      
     String    str    =    formatter.format(curDate);      

         try {
             bos.write(str+":"+vlaue+"  System free memory:  "+getMemory());  
             bos.newLine();
             bos.flush();
            // bos.close();
         } catch (Exception ex) {
             ex.printStackTrace();
         }
     }
    //系统剩余内存大小
     private String getMemory()
     {
     ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
     android.app.ActivityManager.MemoryInfo outInfo =new ActivityManager.MemoryInfo();
     am.getMemoryInfo(outInfo);
     long availMemorySize = outInfo.availMem;
     String strMemorySize = availMemorySize/1024/1024 + "MB"; 
     return strMemorySize;  }

    }
      

  2.   

    怎么优化,什么地方开线程,请高手peijiangping1989
    明示
      

  3.   

    MediaPlayer.OnCompletionListener在里边release了
      

  4.   

    LZ在播放结束后没有释放调media player占有的资源,而是继续加载媒体资源进行播放,最后肯定会耗光内存。
    下面是我写的音乐播放器停止的方法,将media player先停止,然后释放资源,置空,下次播放是重新new一个对象就好 private void stopMediaPlayer() {
    if (mMiniMediaPlayer != null) {
    mMiniMediaPlayer.stop();
    mMiniMediaPlayer.release();
    mMiniMediaPlayer = null;
    }
    }
      

  5.   

    import ycq.informationPublish.filehandle.PropertiesFile;楼主,你这条语句里面类的编写是怎么样的吖?
      

  6.   

    to  zyc13701469860
    我也试过你这样的,每次都释放,可以还是一样的