当前位置:编程学习 > wap >>

求大神帮我看看,这俩类内存释放方面有没有问题,为什么反复运行,内存会增加


package com.vm.surfaceview;
import com.vm.VmActivity;
import com.vm.util.BitmapDecoder;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class FirstView extends SurfaceView implements SurfaceHolder.Callback {
private TutorialThread thread;//刷帧的线程
Paint paint;//画笔
VmActivity activity;
//Bitmap progressBackGround;//加载界面背景图
public FirstView(Context context,Resources resources) {
super(context);
this.activity=(VmActivity)context;
if(activity.progressView!=null)
{
activity.progressView.process+=50;
}
        getHolder().addCallback(this);//注册接口
        this.thread = new TutorialThread(getHolder(), this);//初始化重绘线程
        initBitmap();//初始化图片资源
if(activity.progressView!=null)
{
activity.progressView.process+=50;
}
}
public FirstView(Context context,Resources resources,boolean isStartDownloadThread) {
super(context);
        getHolder().addCallback(this);//注册接口
        this.thread = new TutorialThread(getHolder(), this);//初始化重绘线程
        initBitmap();//初始化图片资源
}
public void initBitmap(){//初始化图片资源的方法
paint = new Paint();//创建画笔
paint.setTextSize(30);//设置字体大小
paint.setAntiAlias(true);
//progressBackGround =BitmapDecoder.getBitmapOfReduce("progress_bg.jpg", 1,800,480);
}
/**
 * 
 * 自己写的绘制方法 
 * 
 */
public void onDraw(Canvas canvas){
//背景图
for(int i=0;i<20;i++)
{
canvas.drawBitmap(//progressBackGround, 0, 0, paint);
}
canvas.save();
paint.setColor(Color.BLUE);
canvas.drawText(activity.cityName, 300, 100, paint);
canvas.drawRect(100, 100, 200, 200, paint);
paint.setColor(Color.RED);
canvas.drawRect(300, 100, 400, 200, paint);
canvas.restore();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
if(event.getRawX()>=100&&event.getRawX()<=200&&event.getRawY()>=100&&event.getRawY()<=200)
{
activity.initProgressView(1);
}
else if(event.getRawX()>=300&&event.getRawX()<=400&&event.getRawY()>=100&&event.getRawY()<=200)
{
activity.gameHandler.sendEmptyMessage(2);
}
return false;
}
return super.onTouchEvent(event);
}
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub

}

public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
if(!this.thread.isAlive())
{
        this.thread.setFlag(true);//设置线程标志位
        this.thread.start();//启动线程
}
}

public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub

        boolean retry = true;//循环标志位
        thread.setFlag(false);//设置循环标志位
        while (retry) {
            try {
                thread.join();//等待线程结束
                retry = false;
            } 
            catch (InterruptedException e) {
             e.printStackTrace();
            }//不断地循环,直到刷帧线程结束
        }
        //progressBackGround.recycle();
        //progressBackGround=null;
        System.gc();
}

/**刷帧线程**/
class TutorialThread extends Thread
{
private int span = 400;//睡眠的毫秒数 
private SurfaceHolder surfaceHolder;
private FirstView firstView;//firstView引用
private boolean flag = false;//循环标志位
        public TutorialThread(SurfaceHolder surfaceHolder, FirstView firstView) {//构造器
            this.surfaceHolder = surfaceHolder;
            this.firstView = firstView;//得到加载界面
            setName("firtView..."+activity.cityName);
        }
        public void setFlag(boolean flag) {//设置标志位
         this.flag = flag;
        }
public void run() {//重写的run方法
Canvas canvas;//画布
            while (this.flag) {//循环
             canvas = null;
                try {
                 // 锁定整个画布,在内存要求比较高的情况下,建议参数不要为null
                 canvas = this.surfaceHolder.lockCanvas(null);
                    synchronized (this.surfaceHolder) {
                     if(canvas!=null)
                     {
                         firstView.onDraw(canvas);//调用绘制方法
                     }
                    }
                } finally {//使用finally语句保证下面代码一定被执行
                    if (canvas != null) {
                     //更新屏幕显示内容
                        this.surfaceHolder.unlockCanvasAndPost(canvas);
                    }
                }
                try{
                 Thread.sleep(span);//睡眠指定毫秒数
                }
                catch(Exception e){//捕获异常信息
                 e.printStackTrace();//打印异常信息
                }
            }
}
}
}



package com.vm;
import com.vm.surfaceview.MainView;
import com.vm.surfaceview.ProgressView;
import com.vm.surfaceview.FirstView;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.KeyEvent;
import android.view.Window;
import android.view.WindowManager;

public class VmActivity extends Activity {
    /** Called when the activity is first created. */
public ProgressView progressView=null;
public FirstView firstView=null;
public String cityName="A城池";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
// 1.隐藏标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 2.设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 3.设置横屏
if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
        setContentView(new FirstView(VmActivity.this,getResources()));
    }
public Handler gameHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
setContentView(firstView);
break;
case 2:
progressView=null;
         if(cityName.indexOf("A")>=0)
         {
         cityName="B城池";
         }
         else
         {
         cityName="A城池";
         }
setContentView(new FirstView(VmActivity.this,getResources()));
break;
case 4://加载进度条
if(progressView != null){progressView = null;}//释放加载界面
progressView = new ProgressView(VmActivity.this,getResources());
setContentView(progressView);
             new Thread(){//线程
             public void run(){//重写的run方法
             Looper.prepare();
             if(cityName.indexOf("A")>=0)
             {
             cityName="B城池";
             }
             else
             {
             cityName="A城池";
             }
             firstView = new FirstView(VmActivity.this,getResources());//初始化WelcomeView
             Looper.loop();
             }
             }.start();//启动线程
break;
}
}
};
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode == KeyEvent.KEYCODE_BACK)
{
exitDialog();
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
 *游戏退出对话框 
 */
public void exitDialog() { 
AlertDialog.Builder builder = new Builder(VmActivity.this); 
builder.setMessage("确定要退出吗?"); 
builder.setTitle("提示"); 
builder.setPositiveButton("确认", 
new android.content.DialogInterface.OnClickListener() { 
public void onClick(DialogInterface dialog, int which) { 
dialog.dismiss(); 
System.exit(0);

}); 
builder.setNegativeButton("取消", 
new android.content.DialogInterface.OnClickListener() { 
public void onClick(DialogInterface dialog, int which) { 
dialog.dismiss(); 

}); 
builder.create().show(); 

/**
 * @author LXP
 * 
 * 进度条调用方法
 * @param toViewId
 * @param isFirstPlay 是否是城镇传送
 * @param isStartDownloadThread 是否开启图片解密线程
 * 
 */
public void initProgressView(int toViewId)
{
//初始化进度条并切换到进度条View
ProgressView.toViewId=toViewId;
Message message=new Message();
Bundle bundle=new Bundle();
message.what=4;
message.setData(bundle);
gameHandler.sendMessage(message);
}
}
内存泄漏OOM SurfaeceView 内存泄漏
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,