【问题标题】:ANDROID: Help, outofmemory bitmap exceeds budget size. how to recycle?ANDROID:帮助,内存不足的位图超出预算大小。如何回收?
【发布时间】:2011-08-12 14:33:32
【问题描述】:

我的 Android 应用程序碰壁了,因为我收到了一个 OutOfMemoryException,其中描述了我的“位图超出了 VM 预算”等等。奇怪的是,代码在一台 PC 上运行,但在另一台 PC 上触发了这个异常。

我有 10 张 900x500 的图像,我使用的代码附在下面。我试过recycle(),它使错误和图像都看不见。我真的需要帮助。在此先感谢:)

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() { 
            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
    }
}

【问题讨论】:

    标签: android exception out-of-memory


    【解决方案1】:

    将位图添加到 ImageView 后,您应该在位图上调用 recycle()。对我有用。

    【讨论】:

    • imageView = new ImageView(this); imageView.setImageDrawable(a.getDrawable(k)); imageView.setPadding(20, 0, 0, 0); ll.addView(imageView); //imageView.getDrawingCache().recycle();在这里,但是当我得到 nullpointerexception:/
    猜你喜欢
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2010-12-07
    • 2010-12-29
    相关资源
    最近更新 更多