| ploglin 發表於 2012-8-24 15:24 recycle() 的用法沒錯,會變成null代表早就不存在或被釋放。
 或者,你可以說明一下,你實際要做的功能,大 ...
我是先用一個主要activity當作基底(是其他圖片的father) 再用setcontentView貼上其他的圖片java黨 就像這個MenuView來切換畫面 因為是動態的畫面
 
 這是我的第一張圖MenuView是一個JAVA黨 還有下面MenuDrawThread 好像是刷新圖片的吧 也是個java黨
 因為我不太懂所以是造著書上的SAMPLE去做的...不知道是不是搞砸了
 
 後面還有很多張圖 都是這兩種類的JAVA黨去做的 在基底activity設定rect 只要點到該畫面的該rect就會做動作或切換貼上另一張圖 一直下去 超過50M 就會出現OOM的錯誤
 
 而且我觀察LOGCAT她一開始貼上第一張圖就超過14M 一直貼圖就會慢慢累加到報表 我都有把不到的圖層java黨設成NULL 但只會只會淺少一點 抵不過增加的記憶體...
 
 package com.example.test03;
 
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
 
 public class MenuView extends SurfaceView implements SurfaceHolder.Callback
 {
 Test1 father;                //Activity的引用
 
 MenuDrawThread mdt;                        //後臺重繪執行緒
 
 
 Bitmap bmpback;                                        //背景圖片
 Bitmap bmpt11b;                                        //test1button pic
 Bitmap bmpt12b;
 Bitmap bmpt13b;
 Bitmap bmpt2b;
 Bitmap bmpt3b;
 Bitmap bmpsignin;
 Bitmap bmptopic;                                //topic pic
 
 
 
 public MenuView(Test1 father)
 {
 
 super(father);
 getHolder().addCallback(this);
 this.father = father;
 
 
 
 mdt = new MenuDrawThread(this,getHolder());                        //新建WelcomeDrawThread物件
 
 initBitmap(father);                                                        //初始化圖片
 
 
 }
 
 public void initBitmap(Context context)
 {
 
 Resources r = context.getResources();                        //獲取Resources物件
 
 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inSampleSize = 1;
 
 bmpback =  BitmapFactory.decodeResource(r, R.drawable.menuback , options);
 bmpt11b = BitmapFactory.decodeResource(r, R.drawable.eyebutton , options);
 bmpt12b= BitmapFactory.decodeResource(r, R.drawable.earbutton , options);
 bmpt13b = BitmapFactory.decodeResource(r, R.drawable.eyeearbutton , options);
 
 }
 
 public void doDraw(Canvas canvas) //方法:用於根據不同狀態繪製螢幕
 {
 //Paint paint = new Paint();                //新建畫筆
 
 canvas.drawBitmap(bmpback, 0, 0, null);
 
 if(father.flag1)
 {
 canvas.drawBitmap(bmpt11b, 250 , 250, null);
 }
 
 if(father.flag2)
 {
 canvas.drawBitmap(bmpt12b, 250 , 400, null);
 }
 
 if(father.flag3)
 {
 canvas.drawBitmap(bmpt13b, 250, 550, null);
 }
 
 
 }
 
 
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
 int height)
 {
 //覆寫surfaceChanged方法
 }
 public void surfaceCreated(SurfaceHolder holder)
 {                        //覆寫surfaceCreated方法
 
 
 if(!mdt.isAlive()){                        //啟動後臺繪製執行緒
 mdt.start();
 }
 }
 public void surfaceDestroyed(SurfaceHolder holder)
 {                //覆寫surfaceDestroyed方法
 
 if(mdt.isAlive()){                                //停止後臺繪製執行緒
 mdt.flag = false;
 }
 }
 
 
 }
 
 
 
 
 
 package com.example.test03;
 
 import android.graphics.Canvas;                                //引入相關類別
 import android.view.SurfaceHolder;                        //引入相關類別
 /*
 * 該類別繼承自Thread,主要負責定時更新WelcomeView
 */
 public class MenuDrawThread extends Thread{
 MenuView father;                                        //WelcomeView物件的引用
 SurfaceHolder surfaceHolder;                //WelcomeView物件的SurfaceHolder
 int sleepSpan = 100;                                //休眠時間
 boolean flag;                                                //執行緒執行旗標位元
 //建構式:初始化主要的成員變數
 public MenuDrawThread(MenuView father,SurfaceHolder surfaceHolder){
 this.father = father;
 this.surfaceHolder = surfaceHolder;
 this.flag = true;
 }
 //方法:執行緒執行方法
 public void run(){
 Canvas canvas = null;                        //新建一個Canvas物件
 while(flag){
 try{
 canvas = surfaceHolder.lockCanvas(null);//為畫布加鎖
 synchronized(surfaceHolder){
 father.doDraw(canvas);                                //重新繪製螢幕
 }
 }
 catch(Exception e){
 e.printStackTrace();//捕獲異常並列印
 }
 finally{
 if(canvas != null){//釋放畫布並將其傳回
 surfaceHolder.unlockCanvasAndPost(canvas);
 }
 }
 try{
 Thread.sleep(sleepSpan);                //休眠一段時間
 }
 catch(Exception e){
 e.printStackTrace();                        //捕獲異常並列印
 }
 }
 }
 }
 
 |