【发布时间】:2013-01-17 23:56:20
【问题描述】:
我面临以下问题:当我的应用被销毁并重新创建多次(例如通过锁定和解锁屏幕)时,它会崩溃并出现以下错误:
02-01 19:24:12.000: E/AndroidRuntime(22362): java.lang.OutOfMemoryError: (Heap Size=62755KB, Allocated=55237KB)
02-01 19:24:12.000: E/AndroidRuntime(22362): at android.graphics.Bitmap.nativeCreateScaledBitmap(Native Method)
02-01 19:24:12.000: E/AndroidRuntime(22362): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:744)
现在,我已经阅读了几篇关于此错误以及如何修复它的帖子,但到目前为止似乎都没有任何帮助。因此,这是我在应用程序中处理图像的方式: 我的应用只有一个看起来像这样的活动:
public class MainActivity extends Activity {
static MenuView mv;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
[...]
mv = (MenuView) findViewById(R.id.menuview);
mv.setOnClickListener(new KlickLauscher());
}
public void onDestroy() {
super.onDestroy();
mv.destroy();
System.gc();
}
MenuView 看起来有点像这样:
public class MenuView extends View {
MyBitmap button;
public MenuView(Context context, AttributeSet attrs) {
super(context, attrs);
initialize();
}
public void initialize() {
button = new MyBitmap("R.drawable.bitmap1");
}
public void onDraw(Canvas c) {
c.drawBitmap(button.getBmp(),0,0,mPaint);
}
public void destroy() {
button.destroy();
}
最后但并非最不重要的一点是,MyBitmap 类如下所示:
class MyBitmap {
Bitmap bmp;
public MyBitmap(int r) {
bmp = MyBitmap.createBmp(r);
}
public Bitmap getBmp() {
return bmp;
}
static Bitmap createBmp(int r) {
// Some irrelevant code
return Bitmap.createScaledBitmap(BitmapFactory.decodeResource(mv.getContext().getResources(),r), width, height, true);
}
public void destroy() {
bmp.recycle();
}
}
我的应用程序中的每一个位图都是使用这个 MyBitmap 类实现的,并且当调用 onDestroy() 时,它们中的每一个都会被回收。长话短说:有谁知道还有什么可能导致错误?
【问题讨论】:
-
onDestroy 不能保证被调用。尝试在 onPause() 中回收。
-
我已经使用 Log.e(...) 来找出何时调用 onDestroy,到目前为止,当我锁定我的应用程序时,它总是被调用。另外,button.getBmp().isRecycled() 返回 true。
-
好的,在这里查看答案stackoverflow.com/questions/9461364/…。这个问题不相关,但答案可能是。
标签: android memory bitmap heap-memory