我知道这个问题已经被问了很多次,但它们都没有明确的解决方案。让我来解释一下这个问题。
- 我有一个Activity,每次加载4张图片。
- 我在onResume()方法中加载这些图片。
- 当加载时,Activity会抛出位图错误。
注意:
- 我是使用setImageResource(R.drawable.xxxx)方法设置图片,而不是直接使用位图/Drawable。
- 图片已正确缩放。
- 该Activity在2.3之前的所有模拟器中都可以正常工作,并且在实际设备(Samsung Galaxy 5)中也可以正常工作。
- 错误出现在第一次初始化时,并且没有触发任何方向更改事件。
- 每张图片的大小为800 x 600像素,平均大小为15kb。
请告诉我任何解决方案。如果你在Android 2.3.3模拟器中遇到类似的问题,请也告诉我。
[更新] - 稍息片段
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
img_topLeft = (ImageView) findViewById(R.id.Img_Alph_Q_TopLeft);
img_topRight = (ImageView) findViewById(R.id.Img_Alph_Q_TopRight);
img_bottomLeft = (ImageView) findViewById(R.id.Img_Alph_Q_BottomLeft);
img_bottomRight = (ImageView) findViewById(R.id.Img_Alph_Q_BottomRight);
...
}
protected void onResume() {
super.onResume();
img_topLeft.setImageResource(R.drawable.xxx);
img_topRight.setImageResource(R.drawable.xxx);
img_bottomLeft.setImageResource(R.drawable.xxx);
img_bottomRight.setImageResource(R.drawable.xxx);
...
}
03-21 08:59:17.362: ERROR/dalvikvm-heap(5883): 进程内存不足,无法进行4320000字节的外部分配。
03-21 08:59:17.412: ERROR/GraphicsJNI(5883): 虚拟机不允许我们分配4320000字节
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): 致命异常:java.lang.OutOfMemoryError: bitmap size exceeds VM budget(位图大小超出了VM预算)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.graphics.Bitmap.nativeCreate(Native Method)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.content.res.Resources.loadDrawable(Resources.java:1709)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.content.res.Resources.getDrawable(Resources.java:581)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.widget.ImageView.resolveUri(ImageView.java:501)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.widget.ImageView.setImageResource(ImageView.java:280)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at Quiz.java:124)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): Quiz.onResume(Quiz.java:92)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.app.Activity.performResume(Activity.java:3832)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.os.Handler.dispatchMessage(Handler.java:99)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.os.Looper.loop(Looper.java:123)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at java.lang.reflect.Method.invokeNative(Native Method)
03-21 08:59:17.432: ERROR/AndroidRuntime(5883): at java.lang.reflect.Method.invoke(Method.javapublic class BitmapResizer {
public static Bitmap decodeImage(Resources res, int id ,int requiredSize){
try {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, id, o);
//Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE=requiredSize;
int width_tmp=o.outWidth, height_tmp=o.outHeight;
int scale=1;
while(true){
if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
break;
width_tmp/=2;
height_tmp/=2;
scale*=2;
}
//decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
return BitmapFactory.decodeResource(res, id, o2);
} catch (Exception e) {
}
return null;
}
}
//Class call
int requiredsize = 100; // Still playing around with this number to find the optimum value
img_topLeft.setImageBitmap(BitmapResizer.decodeImage(getResources(),
AlphResourceSet.R.drawable.xxx, requiredsize));