最近遇到一个应用方面的内存问题,没一点解决的思路,希望大家可以讨论一下。
问题描述如下:
在写一个系统设置,其中包括了声音设置,时间设置等,首先用户点系统设置,进入我们的系统设置主界面,然后用户可以在不同的设置之间,进行切换,代码简述如下。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);
}}
以上是两个分界面的代码简述,当在两个分界面之间切换时,输出如下log信息。
01-27 02:30:39.520: I/System.out(1328): SetSubActivity
01-27 02:30:39.560: D/dalvikvm(1328): GC_EXTERNAL_ALLOC freed 114K, 48% free 2869K/5447K, external 11932K/12041K, paused 23ms
01-27 02:30:39.710: D/dalvikvm(1328): GC_EXTERNAL_ALLOC freed 29K, 47% free 2917K/5447K, external 13905K/14648K, paused 24ms
01-27 02:30:39.840: D/dalvikvm(1328): GC_EXTERNAL_ALLOC freed 11K, 46% free 2949K/5447K, external 16819K/16848K, paused 23ms
01-27 02:30:39.870: D/dalvikvm(1328): GC_EXTERNAL_ALLOC freed 0K, 46% free 2949K/5447K, external 16819K/16848K, paused 23ms
01-27 02:30:39.900: I/dalvikvm-heap(1328): Clamp target GC heap from 25.628MB to 24.000MB
01-27 02:30:39.900: D/dalvikvm(1328): GC_FOR_MALLOC freed <1K, 46% free 2949K/5447K, external 18833K/20881K, paused 17ms
01-27 02:30:39.990: I/System.out(1328): VolMainActivity
01-27 02:30:43.440: I/System.out(1328): SetSubActivity
01-27 02:30:43.520: D/dalvikvm(1328): GC_EXTERNAL_ALLOC freed 101K, 46% free 3033K/5575K, external 18688K/19986K, paused 24ms
01-27 02:30:43.520: E/dalvikvm-heap(1328): 768912-byte external allocation too large for this process.
01-27 02:30:43.530: E/GraphicsJNI(1328): VM won't let us allocate 768912 bytes

01-27 02:30:43.550: I/dalvikvm-heap(1328): Clamp target GC heap from 25.568MB to 24.000MB
01-27 02:30:43.550: D/dalvikvm(1328): GC_FOR_MALLOC freed 1K, 46% free 3031K/5575K, external 18688K/19986K, paused 16ms
01-27 02:30:43.560: D/AndroidRuntime(1328): Shutting down VM
01-27 02:30:43.560: W/dalvikvm(1328): threadid=1: thread exiting with uncaught exception (group=0x40015560)
01-27 02:30:43.570: E/AndroidRuntime(1328): FATAL EXCEPTION: main
01-27 02:30:43.570: E/AndroidRuntime(1328): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sound.system/sound.activity.TimeMainActivity}: android.view.InflateException: Binary XML file line #49: Error inflating class <unknown>
01-27 02:30:43.570: E/AndroidRuntime(1328):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
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的某型手机上,删除其中的一,两图片,可以正常运行,但要是放在我们自己的开发板上,要删除一个半才能运行。
不知道各位有什么好的主意没。