0

可能重复:
启用 largeHeap 的位图回收

嗨,我在这里做一个应用程序,我正在使用位图显示图像,图像显示良好,但是因为这个类我在另一个类中出现内存不足异常。请查看我的代码以及如何解决这个问题。 .

 public class DesignofatozActivity extends Activity {

BitmapDrawable sounddrawable,erasedrawable,backdrwable,fwddrwable,captiondrwable;
Bitmap soundbitmap,eraseBitmap,backbitmap,fwdbitmap,captionbitmap;
    bitmapOrg,bitmapOrg1,bitmapOrg2,bitmapOrg3,bitmapOrg4,bitmapOrg5,bitmapOrg6;
MyView myview;
File f;
ImageView d1,d2,d3,d4,d5,d6;
public  boolean action=false;
RelativeLayout relativeLayout,layout,relativeLayout2;


 Button c1,c2,c3,c4,c5,c6,c7,c8; 
 MediaPlayer player;
 MediaPlayer mediay2;
 ImageView horn;
 float screenHeight,screenWidth,screendensity;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setNoTitle();
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
         screenHeight = displaymetrics.heightPixels;
         screenWidth = displaymetrics.widthPixels;
         screendensity = displaymetrics.densityDpi;
        Log.i("screenHeight",""+screenHeight);
        Log.i("screenWidth",""+screenWidth);
        Log.i("screendensity",""+screendensity);

         setContentView(R.layout.line);
         relativeLayout=(RelativeLayout)findViewById(R.id.relative);

      relativeLayout.setBackgroundColor(Color.WHITE);

      relativeLayout2=(RelativeLayout)findViewById(R.id.relative2);

      RelativeLayout.LayoutParams layoutrel2= (RelativeLayout.LayoutParams)  relativeLayout2.getLayoutParams();    
      layoutrel2.height=(int)(25*(screenHeight/600));  

   int toplay=(int)(90*(screenHeight/600));

      layout=new RelativeLayout(this);
      RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      lp.setMargins(0, toplay, 0,0);

      layout.setLayoutParams(lp);
      relativeLayout.addView(layout,lp); 

         int topmyvi=(int)(45*(screenHeight/600));
        myview = new MyView(this);
             myview.setId(004);
          RelativeLayout.LayoutParams lp6 = new RelativeLayout.LayoutParams(
         LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
          myview.setLayoutParams(lp6);

    lp6.setMargins(0, topmyvi, 0,0);
    relativeLayout.addView(myview,lp6);

    ImageView I2=new ImageView(this);

    if(captiondrwable!= null) {
        captionbitmap.recycle();
           captiondrwable= null;
            }

           captionbitmap=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.caption22_1));
     captiondrwable = new BitmapDrawable(captionbitmap); 
       I2.setBackgroundDrawable(captiondrwable);

    int left2=(int)(15*(screenWidth/1024));

    int widthhh2=(int)(100*(screenWidth/1024));
    int hifhtttt2=(int)(50*(screenHeight/600));


       RelativeLayout.LayoutParams rlp2=new RelativeLayout.LayoutParams(widthhh2,hifhtttt2);

    rlp2.setMargins(left2, topmyvi, 0, 0);
    relativeLayout.addView(I2,rlp2);





    ImageView b1=new ImageView(this);
    if(erasedrawable!= null) {
         eraseBitmap.recycle();
        erasedrawable= null;
         }
      eraseBitmap=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.eraser_501));
   erasedrawable = new BitmapDrawable(eraseBitmap); 
   b1.setBackgroundDrawable(erasedrawable);

    int leftb1=(int)(650*(screenWidth/1024));
   int topb1=(int)(10*(screenHeight/600));
 int widtb1=(int)(100*(screenWidth/1024));
 int hightb1=(int)(100*(screenHeight/600));

 RelativeLayout.LayoutParams rlp3=new RelativeLayout.LayoutParams(widtb1,hightb1);
 rlp3.setMargins(leftb1, topb1, 0, 0);
 relativeLayout.addView(b1,rlp3);

            b1.setOnClickListener(new OnClickListener() {

  //        @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
         try{

                mBitmap.eraseColor(android.graphics.Color.TRANSPARENT);
                Canvas Canvas=new Canvas(mBitmap);

                action=true;
            myview.onDraw(Canvas);

                }catch(IllegalStateException ie){
                    ie.printStackTrace();
                }
    }
});

  int lefth1=(int)(830*(screenWidth/1024));
  int toph1=(int)(35*(screenHeight/600));
int width1=(int)(60*(screenWidth/1024));
int highth1=(int)(60*(screenHeight/600));
horn=new ImageView(this);

if(sounddrawable!= null) {
     soundbitmap.recycle();
    sounddrawable= null;
      }
soundbitmap=BitmapFactory.decodeStream(getResources().openRawResource( R.drawable.horn));
sounddrawable = new BitmapDrawable(soundbitmap); 
horn.setBackgroundDrawable(sounddrawable);


  RelativeLayout.LayoutParams hn=new RelativeLayout.LayoutParams(width1,highth1);
  hn.setMargins(lefth1,toph1,0,0);
  relativeLayout.addView(horn,hn);

  horn.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(mediay2==null)
            {

             mediay2 = MediaPlayer.create(DesignofatozActivity.this, R.raw.hwprepsheets);

            }
             mediay2.start();
        if(mediay2!=null)
        {

        }

        }

    });

  ImageView next=(ImageView)findViewById(R.id.imv1a);

  if(fwddrwable!= null) {
   fwdbitmap.recycle();
       fwddrwable= null;
            }

  fwdbitmap=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.next_50));
      fwddrwable = new BitmapDrawable(fwdbitmap); 
      next.setBackgroundDrawable(fwddrwable);
  RelativeLayout.LayoutParams layoutnxt= (RelativeLayout.LayoutParams) next.getLayoutParams();     
  layoutnxt.height=(int)(30*(screenHeight/600));  
  layoutnxt.width=(int)(50*(screenWidth/1024));
  next.setOnClickListener(new OnClickListener() {

 //         @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Log.i("next","next");
            Intent i =new Intent(DesignofatozActivity.this,Dots.class);
            startActivity(i);
        }   
    });
  ImageView back=(ImageView)findViewById(R.id.back);

  if(backdrwable!= null) {
   backbitmap.recycle();
   backdrwable= null;
       }

  backbitmap=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.back1_50));
  backdrwable = new BitmapDrawable(backbitmap); 
  back.setBackgroundDrawable(backdrwable);
  RelativeLayout.LayoutParams layoutbak= (RelativeLayout.LayoutParams) back.getLayoutParams();     
  layoutbak.height=(int)(30*(screenHeight/600));  
  layoutbak.width=(int)(50*(screenWidth/1024));
  back.setOnClickListener(new OnClickListener() {

    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        Intent i =new Intent(DesignofatozActivity.this,Slantlines.class);
        startActivity(i);
    }
});

    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setDither(true);
    //mPaint.setColor(0xFFFF0000);
    mPaint.setColor(Color.BLACK);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(6);


 }



private void setNoTitle() {
    // TODO Auto-generated method stub
    requestWindowFeature(Window.FEATURE_NO_TITLE);
}
 private Paint       mPaint;
  private Bitmap  mBitmap;

    public void colorChanged(int color) {
        mPaint.setColor(color);
    }

    public class MyView extends View
    {

            private Canvas  mCanvas;
            private Path    mPath;
            private Paint   mBitmapPaint;

        public MyView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
             mPath = new Path();
                mBitmapPaint = new Paint(Paint.DITHER_FLAG);
        }
         @Override
            protected void onSizeChanged(int w, int h, int oldw, int oldh)       {
                super.onSizeChanged(w, h, oldw, oldh);
                if (mBitmap != null) {
                    mBitmap.recycle();
                    mBitmap=null;
                 }

                mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
                mCanvas = new Canvas(mBitmap);
                mCanvas.setBitmap(mBitmap);


            }


          @Override
            protected void onDraw(Canvas canvas) {

              if(action)
              {
                  invalidate();
              }

              Paint painto = new Paint();
               painto.setAntiAlias(true);


               painto.setStrokeWidth(3);
               painto.setStyle(Paint.Style.FILL);


              int leftx1=(int)(15*(screenWidth/1024));
                 int leftx2=(int)(1010*(screenWidth/1024));
                    int topy1=(int)(60*(screenHeight/600));
                    int topy2=(int)(530*(screenHeight/600));

                       canvas.drawLine(leftx1, topy1, leftx2, topy1, painto);   
                       canvas.drawLine(leftx1, topy1, leftx1, topy2, painto);
                       canvas.drawLine(15, topy2, leftx2, topy2, painto);
                       canvas.drawLine(leftx2, topy1, leftx2, topy2, painto);


            bitmapOrg = BitmapFactory.decodeResource(getResources(),
                        R.drawable.circles1_4);
            int leftorg=(int)(150*(screenWidth/1024));
            int toporg=(int)(110*(screenHeight/600));
              canvas.drawBitmap(bitmapOrg, leftorg, toporg, painto);

              bitmapOrg.recycle();
              bitmapOrg=null;

              bitmapOrg1 = BitmapFactory.decodeResource(getResources(),
                        R.drawable.circles1_5);
              int leftorg1=(int)(430*(screenWidth/1024));
                int toporg1=(int)(130*(screenHeight/600));
               canvas.drawBitmap(bitmapOrg1, leftorg1,toporg1, painto);
               bitmapOrg1.recycle();
                  bitmapOrg1=null;

       bitmapOrg2 = BitmapFactory.decodeResource(getResources(),
                        R.drawable.circles1_6);
       int leftorg2=(int)(650*(screenWidth/1024));
               canvas.drawBitmap(bitmapOrg2, leftorg2,toporg, painto);

               bitmapOrg2.recycle();
                  bitmapOrg2=null;
         bitmapOrg3 = BitmapFactory.decodeResource(getResources(),
                        R.drawable.circles1_1);
         int leftorg3=(int)(170*(screenWidth/1024));
         int toporg3=(int)(350*(screenHeight/600));
               canvas.drawBitmap(bitmapOrg3, leftorg3,toporg3, painto);
               bitmapOrg3.recycle();
                  bitmapOrg3=null;
              bitmapOrg4 = BitmapFactory.decodeResource(getResources(),
                        R.drawable.circles1_3);
              int leftorg4=(int)(680*(screenWidth/1024));
               canvas.drawBitmap(bitmapOrg4, leftorg4,toporg3, painto);

                  bitmapOrg4.recycle();
                  bitmapOrg4=null;
            bitmapOrg5 = BitmapFactory.decodeResource(getResources(),
                        R.drawable.circles1_2);

            int leftorg5=(int)(400*(screenWidth/1024));
             int toporg5=(int)(300*(screenHeight/600));
               canvas.drawBitmap(bitmapOrg5, leftorg5,toporg5, painto);

               bitmapOrg5.recycle();
                  bitmapOrg5=null;
               Paint paint1 = new Paint();
                paint1.setAntiAlias(true);
                paint1.setColor(Color.BLACK);
                paint1.setStrokeWidth(3);
                paint1.setStyle(Paint.Style.FILL);
                paint1.setTextSize(13);
                canvas.drawText("Get  ready  to  write  place  your  pen  on  the  dot  and  follow  direction ", 120, 20, paint1);
                canvas.drawText("indicated  by  the  arrow . ", 120, 38, paint1);


                Paint p = new Paint();
                p.setAntiAlias(true);
                p.setTextSize(120);
                p.setColor(Color.LTGRAY);
                Typeface font = Typeface.createFromAsset(getAssets(), "font/KINDTRG.TTF"); 


                p.setTypeface(font);            



               canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

                canvas.drawPath(mPath, mPaint); 


       }  private float mX, mY;
        private  final float TOUCH_TOLERANCE = 2;

     private void touch_start(float x, float y) {
      mPath.reset();
        mPath.moveTo(x, y);
            mX = x;
     mY = y;
     }
     private void touch_move(float x, float y) {
     float dx = Math.abs(x - mX);
    float dy = Math.abs(y - mY);
   if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
           mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
       mX = x;
        mY = y;
     }
  }
    private void touch_up() {
        mPath.lineTo(mX, mY);
         // commit the path to our offscreen
        mCanvas.drawPath(mPath, mPaint);
 // kill this so we don't double draw
      mPath.reset();
      }

   @Override
   public boolean onTouchEvent(MotionEvent event) {
         float x = event.getX();
         y = event.getY();

  switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
      touch_start(x, y);
      invalidate();
      break;
  case MotionEvent.ACTION_MOVE:
      touch_move(x, y);
      invalidate();
      break;
  case MotionEvent.ACTION_UP:
      touch_up();
      invalidate();
      break;
  }
   return true;
  }


   }
    public void clearAllResources() {

        // Set related variables null

        System.gc();
        Runtime.getRuntime().gc();
       }

      @Override
        protected void onPause() {

            if (mediay2 != null){
                mediay2.stop();
                mediay2.release();
                mediay2=null;
          }

            clearAllResources();
            super.onPause();
        }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        System.gc();
        Runtime.getRuntime().gc(); 
        unbindDrawables(findViewById(R.id.relative));
    }

        private void unbindDrawables(View view) {
        // TODO Auto-generated method stub
         if (view.getBackground() != null) {
             view.getBackground().setCallback(null);
         }
         if (view instanceof ViewGroup) {
             for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                 unbindDrawables(((ViewGroup) view).getChildAt(i));
             }
             ((ViewGroup) view).removeAllViews();
         }
        }
        @Override
            protected void onResume() {
                // TODO Auto-generated method stub
                super.onResume();

            }

    }
4

3 回答 3

4

您使用的内存堆超过了 gcc 允许的大小。您必须在清单添加应用程序中使用 slaced 位图或 +3.0

android:largeHeap="true"分配更多的堆大小。

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
    android:largeHeap="true">...
于 2012-11-05T12:39:54.960 回答
0

试试这个

获得位图后,使用后回收位图,这将解决一些问题。

Bitmap finalImage;
finalImage.recycle();

或尝试 onResume()

System.gc();
于 2012-11-05T11:53:24.093 回答
0

我建议你看看这个线程:Strange out of memory issue while loading an image to a Bitmap object

这是线程上的答案:

public Bitmap readAssetsBitmap(String filename) throws IOException {
        try {
            BitmapFactory.Options options = new BitmapFactory.Options(); 
            options.inPurgeable = true;
            Bitmap bitmap = BitmapFactory.decodeStream(assets.open(filename), null, options);
            if(bitmap == null) {
                throw new IOException("File cannot be opened: It's value is null");
            }
            else {
                return bitmap;
            }
        } catch (IOException e) {
            throw new IOException("File cannot be opened: " + e.getMessage());
        }

    }

记住回收位图并将它们设置为 null 一旦它们被用于确保得到 GCed。

注意:你不应该打电话System.gc();

我希望这有帮助。

于 2012-11-05T12:53:46.997 回答