一个不好解的内存问题
最近遇到一个应用方面的内存问题,没一点解决的思路,希望大家可以讨论一下。
问题描述如下:
在写一个系统设置,其中包括了声音设置,时间设置等,首先用户点系统设置,进入我们的系统设置主界面,然后用户可以在不同的设置之间,进行切换,代码简述如下。
public class TimeMainActivity extends Activity implements OnClickListener{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //窗口全屏显示 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.layout_time); System.out.println("TimeMainActivity"); InitView(); } private void InitView() { } public void onClick(View v) { // TODO Auto-generated method stub m_event.onClick(v); }}
public class VolMainActivity extends Activity implements OnClickListener { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 窗口全屏显示 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.layout_vol); System.out.println("VolMainActivity"); InitView(); } private void InitView() { } public void onClick(View v) { // TODO Auto-generated method stub m_event.onClick(v); }}
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1487)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
01-27 02:30:43.570: E/AndroidRuntime(1328): at sound.activity.MainActivity.SetSubActivity(MainActivity.java:80)
01-27 02:30:43.570: E/AndroidRuntime(1328): at sound.userclass.CheckBoxAdapter$1.onClick(CheckBoxAdapter.java:122)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.view.View.performClick(View.java:2485)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.widget.CompoundButton.performClick(CompoundButton.java:99)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.view.View$PerformClick.run(View.java:9080)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.os.Handler.handleCallback(Handler.java:587)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.os.Handler.dispatchMessage(Handler.java:92)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.os.Looper.loop(Looper.java:130)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.app.ActivityThread.main(ActivityThread.java:3683)
01-27 02:30:43.570: E/AndroidRuntime(1328): at java.lang.reflect.Method.invokeNative(Native Method)
01-27 02:30:43.570: E/AndroidRuntime(1328): at java.lang.reflect.Method.invoke(Method.java:507)
01-27 02:30:43.570: E/AndroidRuntime(1328): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-27 02:30:43.570: E/AndroidRuntime(1328): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-27 02:30:43.570: E/AndroidRuntime(1328): at dalvik.system.NativeStart.main(Native Method)
01-27 02:30:43.570: E/AndroidRuntime(1328): Caused by: android.view.InflateException: Binary XML file line #49: Error inflating class <unknown>
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.view.LayoutInflater.createView(LayoutInflater.java:518)
01-27 02:30:43.570: E/AndroidRuntime(1328): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.view.LayoutInflater.rInflate(LayoutInflater.java:626)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
01-27 02:30:43.570: E/AndroidRuntime(1328): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.app.Activity.setContentView(Activity.java:1657)
01-27 02:30:43.570: E/AndroidRuntime(1328): at sound.activity.TimeMainActivity.onCreate(TimeMainActivity.java:34)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
01-27 02:30:43.570: E/AndroidRuntime(1328): ... 17 more
01-27 02:30:43.570: E/AndroidRuntime(1328): Caused by: java.lang.reflect.InvocationTargetException
01-27 02:30:43.570: E/AndroidRuntime(1328): at java.lang.reflect.Constructor.constructNative(Native Method)
01-27 02:30:43.570: E/AndroidRuntime(1328): at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.view.LayoutInflater.createView(LayoutInflater.java:505)
01-27 02:30:43.570: E/AndroidRuntime(1328): ... 29 more
01-27 02:30:43.570: E/AndroidRuntime(1328): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.graphics.Bitmap.nativeCreate(Native Method)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.content.res.Resources.loadDrawable(Resources.java:1709)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.view.View.<init>(View.java:1951)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.widget.ImageView.<init>(ImageView.java:112)
01-27 02:30:43.570: E/AndroidRuntime(1328): at android.widget.ImageView.<init>(ImageView.java:108)
01-27 02:30:43.570: E/AndroidRuntime(1328): ... 32 more
通过以上信息发现,是分配不了内存造成的,经过分析发现问题出在setContentView函数中,因为在我们的布局文件中包含了很多图片文件,drawable文件夹的总大小也只有625K,将该程序放在htc的某型手机上,删除其中的一,两图片,可以正常运行,但要是放在我们自己的开发板上,要删除一个半才能运行。
不知道各位有什么好的主意没。
[解决办法]
牛XX了,写XML文件都能写出OOM来
[解决办法]