开发者

ANDROID: Help, outofmemory bitmap exceeds budget size. how to recycle?

I've hit a wall with my Android-app, as I'm getting an OutOfMemoryException with the description that my "bitmap exceeds VM budget" and so on. The weird thing is that the code works on one PC but triggers this exception in another.

I have like 10 900x500 images and the code I'm using is enclosed below. I have tried to recycle(), which renders both the errors and the images invisible. I really need help with this. Thanks in advance:)

public class AVMSystemActivity extends Activity implements Runnable{
    /** Called when the activity is first created. */
    Field[] drawables;
    ImageView imageView;
    boolean adFlip=true;
    Resources a;
    int k=0x7f020000;
    int last;
    private RefreshHandler mRedrawHandler = new RefreshHandler();  
    int adCount=0;
    RelativeLayout ll;
    class RefreshHandler extends Handler {  
        @Override  
        public void handleMessage(Message msg) {  
            AVMSystemActivity.this.updateAd();  
        }  

        public void sleep(long delayMillis) {  
            this.removeMessages(0);  
            sendMessageDelayed(obtainMessage(0), delayMillis);  
        }  
    };  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.i("TEST","A\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
        drawables = sepekin.software.R.drawable.class.getFields();

        a=this.getResources();
        int i=0x7f020000;
        boolean done=true;
        ll = (RelativeLayout) findViewById(R.id.rlout);
        imageView = new ImageView(this);
        ll.addView(imageView);

        try
        {
            for (i=0x7f020000;i<0x7f020040;i++)
            {
                String name=a.getResourceName(i);
                name=name.substring(name.indexOf(':')+1);
                name=name.substring(9);
                if(name.startsWith("ad"))
                {
                    Log.i("res tara",name);
                    //imageView.setImageDrawable(a.getDrawable(i));//------
                    //imageView.setBackgroundDrawable(a.getDrawable(i));            
                    adCount++;
                }
                else
                {
                    last=i;
                    Log.i("LAST ELSE",i+"");
                    break;
                }
            }
        }
        catch(Exception e)
        {
            last=i;
            Log.i("LAST",i+"");
            done=false;
            e.printStackTrace();
        }
        Button btn=(Button)findViewById(R.id.restbutton);
        btn.setOnClickListener(new View.OnClickListener开发者_如何学Python() { 
            public void onClick(View view) { 
                Log.i("ACTION","BUTTON CLICKED");
                adFlip=!adFlip;
                try
                {
                    Intent i = new Intent(AVMSystemActivity.this,RestListActivity.class);   
                    startActivity(i);
                }
                catch(Exception e)
                {
                    Log.i("cort",e.toString());
                }
            } 
        });
        updateAd();
    }
    int currentInt=0;

    private void updateAd(){  
        Log.i("update","lan");
        try
        { 
            if(adFlip)
            {  
                mRedrawHandler.sleep(1000);
                //*******
                if(k==last)
                    k=0x7f020000;
                else 
                {
                    if(a.getResourceName(k).contains("icon"))
                    {
                        Log.i("update",a.getResourceName(k));
                    }
                    else
                    {
                        Log.i("update",a.getResourceName(k)+"__--");

                        imageView = new ImageView(this);
                        imageView.setImageDrawable(a.getDrawable(k));
                        imageView.setPadding(20, 0, 0, 0);
                        ll.addView(imageView);
                        //imageView.getDrawingCache().recycle();
                    }
                    k++;
                }
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }  
    @Override
    public void run() {
        // TODO Auto-generated method stub
    }
}


You should call recycle() on the Bitmap after you've added the Bitmap to your ImageView. Works for me.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜