【发布时间】:2011-07-19 12:13:47
【问题描述】:
我知道这个问题被问过几次。他们都不清楚解决方案。让我解释一下这个问题。
- 我有一个一次加载 4 张图像的 Activity。
- 我在 onResume() 方法中加载图像。
- Activity 在加载时抛出位图错误。
注释。
- 我正在使用 setImageResource(R.drawable.xxxx) 方法调用设置图像,而不是直接使用位图/drawables。
- 图像已正确缩放。
- 该活动在 2.3 之前的所有模拟器中运行良好,并且在实际设备中运行良好 (Samsung Galaxy 5)
- 第一次初始化时出现错误,并且没有触发方向更改事件。
- 图片大小为 800 x 600,平均大小为 15kb(每张)。
让我知道任何解决方案。如果您对 Android 2.3.3 模拟器有类似问题,请告诉我。
[更新]-sn-ps
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: 错误/dalvikvm-heap(5883): 4320000 字节的外部分配对于这个进程来说太大了。 03-21 08:59:17.412: 错误/GraphicsJNI(5883): VM 不允许我们分配 4320000 字节 03-21 08:59:17.432:错误/AndroidRuntime(5883):致命异常:主要 03-21 08:59:17.432: 错误/AndroidRuntime(5883): java.lang.OutOfMemoryError: 位图大小超过 VM 预算 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.graphics.Bitmap.nativeCreate(Native Method) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.graphics.Bitmap.createBitmap(Bitmap.java:477) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.graphics.Bitmap.createBitmap(Bitmap.java:444) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.content.res.Resources.loadDrawable(Resources.java:1709) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.content.res.Resources.getDrawable(Resources.java:581) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.widget.ImageView.resolveUri(ImageView.java:501) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.widget.ImageView.setImageResource(ImageView.java:280) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 Quiz.java:124) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): Quiz.onResume(Quiz.java:92) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.app.Activity.performResume(Activity.java:3832) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.app.ActivityThread.access$1500(ActivityThread.java:117) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.os.Handler.dispatchMessage(Handler.java:99) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.os.Looper.loop(Looper.java:123) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 android.app.ActivityThread.main(ActivityThread.java:3683) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 java.lang.reflect.Method.invokeNative(Native Method) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 java.lang.reflect.Method.invoke(Method.java:507) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 03-21 08:59:17.432: 错误/AndroidRuntime(5883): at dalvik.system.NativeStart.main(Native Method)
谢谢。设法解决它。共享代码以造福他人 解决此问题的自定义类。基于@Janardhanan.S 链接。
public 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));
【问题讨论】:
-
发布您的 onResume 代码,它可能更容易为您提供帮助。
标签: android android-emulator android-layout