Android &引用;超出VM预算”;关于第2.3.3条和;“尝试使用回收的图像”;在2.2上使用相同的代码

Android &引用;超出VM预算”;关于第2.3.3条和;“尝试使用回收的图像”;在2.2上使用相同的代码,android,canvas,bitmap,imageview,bitmapfactory,Android,Canvas,Bitmap,Imageview,Bitmapfactory,我厌倦了在stackoverflow和Google上尝试各种可能性。。。。。。 没有得到我想要的 bt=BitmapFactory.decodeResource(getResources(), dressarray[indexdress],options); //Background1 = getApplicationContext().getResources().getDrawable(dressarray[indexdress]); bt1=Bitmap.createBitmap(bt);

我厌倦了在stackoverflow和Google上尝试各种可能性。。。。。。 没有得到我想要的

bt=BitmapFactory.decodeResource(getResources(), dressarray[indexdress],options);
//Background1 = getApplicationContext().getResources().getDrawable(dressarray[indexdress]);
bt1=Bitmap.createBitmap(bt);
dress.setImageBitmap(bt1);
我有这个代码在各种条件下。。。着装规范是
ImageView
我的屏幕上有很多图像。。 共有10个
imagebutton
,对于那些我有1个
onClick
方法的按钮,该方法通过检查按下哪个按钮,对特定的
ImageView
执行上述操作

最后,我在
onClick
中调用了一个方法来回收位图(这是我提问之前的最后一个变体)。 调用该方法是单击
onClick

下面是回收的方法

public void callrecycle()
    {
        bt.recycle();
        bt=null;
        bt1=null;
        System.gc();
    }
现在的问题是,我有一个具有HTC EVO屏幕密度和分辨率的模拟器,平台为2.3.3,第二个模拟器的密度为180,分辨率为320X480,平台为2.2

在2.3.3我得到一个错误

07-06 10:42:41.898: D/dalvikvm(420): GC_EXTERNAL_ALLOC freed <1K, 52% free 2611K/5379K, external 19034K/19732K, paused 55ms
07-06 10:42:41.918: E/dalvikvm-heap(420): 1382400-byte external allocation too large for this process.
07-06 10:42:42.028: I/dalvikvm-heap(420): Clamp target GC heap from 25.682MB to 24.000MB
07-06 10:42:42.028: E/GraphicsJNI(420): VM won't let us allocate 1382400 bytes
07-06 10:42:42.028: D/dalvikvm(420): GC_FOR_MALLOC freed <1K, 52% free 2611K/5379K, external 19034K/19732K, paused 35ms
07-06 10:42:42.028: D/AndroidRuntime(420): Shutting down VM
07-06 10:42:42.028: W/dalvikvm(420): threadid=1: thread exiting with uncaught exception (group=0x40015560)
07-06 10:42:42.050: E/AndroidRuntime(420): FATAL EXCEPTION: main
07-06 10:42:42.050: E/AndroidRuntime(420): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
07-06 10:42:42.050: E/AndroidRuntime(420):  at android.graphics.Bitmap.nativeCreate(Native Method)
07-06 10:42:42.050: E/AndroidRuntime(420):  at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
07-06 10:42:42.050: E/AndroidRuntime(420):  at android.graphics.Bitmap.createBitmap(Bitmap.java:432)
07-06 10:42:42.050: E/AndroidRuntime(420):  at android.graphics.Bitmap.createBitmap(Bitmap.java:383)
07-06 10:42:42.050: E/AndroidRuntime(420):  at android.graphics.Bitmap.createBitmap(Bitmap.java:367)
07-06 10:42:42.050: E/AndroidRuntime(420):  at com.internetdesignzone.dressup.DressUp$1.onClick(DressUp.java:334)
07-06 10:42:42.050: E/AndroidRuntime(420):  at android.view.View.performClick(View.java:2485)
07-06 10:42:42.050: E/AndroidRuntime(420):  at android.view.View$PerformClick.run(View.java:9080)
07-06 10:42:42.050: E/AndroidRuntime(420):  at android.os.Handler.handleCallback(Handler.java:587)
07-06 10:42:42.050: E/AndroidRuntime(420):  at android.os.Handler.dispatchMessage(Handler.java:92)
07-06 10:42:42.050: E/AndroidRuntime(420):  at android.os.Looper.loop(Looper.java:123)
07-06 10:42:42.050: E/AndroidRuntime(420):  at android.app.ActivityThread.main(ActivityThread.java:3683)
07-06 10:42:42.050: E/AndroidRuntime(420):  at java.lang.reflect.Method.invokeNative(Native Method)
07-06 10:42:42.050: E/AndroidRuntime(420):  at java.lang.reflect.Method.invoke(Method.java:507)
07-06 10:42:42.050: E/AndroidRuntime(420):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-06 10:42:42.050: E/AndroidRuntime(420):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-06 10:42:42.050: E/AndroidRuntime(420):  at dalvik.system.NativeStart.main(Native Method)
07-06 10:42:44.968: I/Process(420): Sending signal. PID: 420 SIG: 9
有人能告诉我原因吗? 请告诉我如何重复使用回收的位图。 我不想降低位图的质量

我通过的选项有

inPurgeable=true
inInputShareable=true
注意:如果我不使用位图,直接编写
dress.setImageResource(dressarray[IndexAddress])

该应用程序就像2.2中的冠军一样工作,但在第1次点击2.3.3时就以超出预算而关闭
dressarray[IndexDiss]是一个包含R.drawble.imgid的图像数组,所有图像都是PNG图像

我当时通过使用降级图像解决了这个问题

您可以使用选项中的
inSampleSize
inpurgable
来避免此错误。 和重复使用相同的
位图
变量,并在每次使用后将其设置为
null

尽可能调用
System.gc()
。它不调用gc,但给出了可以启动的提示

inpurgable
将使您的位图对象在执行
gc()
时可清除

inSampleSize
将降级位图,因此请使用正确的值

此外,您还可以在创建位图时调整位图的大小,以便减小其大小。使用
createScaledBitmap()


希望它能帮助其他人。

请看我对同一问题的回答:我的方向固定在肖像和代码日志链接上,不起作用。因为这件事,我现在一天比一天笨@Shrikant如果你有任何Weakreference的代码snippent,请给我一个链接。我也有同样的问题,我在使用它们后通过设置(bitmap=null)解决了这个问题。这样,您的GC将立即删除它们。如果我使用recycle(),我在使用回收的bitmap@osayilgan我也尝试过删除回收,但它只适用于2.3.3中的2.2,它在固定的点击次数后提供OOM
inPurgeable=true
inInputShareable=true