求大神帮我看看,这俩类内存释放方面有没有问题,为什么反复运行,内存会增加
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