2013-08-27 31 views
0
if (someId.matches("A") || someId.matches("a")) { 
     addLetters(); 
     addIcon(R.drawable.apple); 
     addSentence("A is for APPLE"); 
     btnPlay.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       playTheSound(R.raw.a); 
      } 
     }); 
    } 
    if (someId.matches("B") || someId.matches("b")) { 
     addLetters(); 
     addIcon(R.drawable.ball); 
     addSentence("B is for BALL"); 
     btnPlay.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       playTheSound(R.raw.a); 
      } 
     }); 
    } 

public void addIcon(int iconResource) { 
    ivLetterIcon.setImageResource(iconResource); 
} 

第一次加载代码的活动时,一切正常。我可以选择信A并返回到上一个活动,并回到信A并继续做它,我的应用程序不FC,但是当我选择信B或信我的应用程序FC旁边的任何其他字母。重复使用可绘制资源的应用FC

我的logcat显示以下内容:

08-27 14:58:52.691: E/AndroidRuntime(716): FATAL EXCEPTION: main 
08-27 14:58:52.691: E/AndroidRuntime(716): java.lang.OutOfMemoryError 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:500) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:353) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.content.res.Resources.loadDrawable(Resources.java:1930) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.content.res.Resources.getDrawable(Resources.java:659) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.widget.ImageView.resolveUri(ImageView.java:611) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.widget.ImageView.setImageResource(ImageView.java:354) 
08-27 14:58:52.691: E/AndroidRuntime(716): at com.test.testing.AlpDisplay.addIcon(AlpDisplay.java:548) 
08-27 14:58:52.691: E/AndroidRuntime(716): at com.test.testing.AlpDisplay.onCreate(AlpDisplay.java:204) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.app.Activity.performCreate(Activity.java:5008) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.os.Looper.loop(Looper.java:137) 
08-27 14:58:52.691: E/AndroidRuntime(716): at android.app.ActivityThread.main(ActivityThread.java:4745) 
08-27 14:58:52.691: E/AndroidRuntime(716): at java.lang.reflect.Method.invokeNative(Native Method) 
08-27 14:58:52.691: E/AndroidRuntime(716): at java.lang.reflect.Method.invoke(Method.java:511) 
08-27 14:58:52.691: E/AndroidRuntime(716): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
08-27 14:58:52.691: E/AndroidRuntime(716): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-27 14:58:52.691: E/AndroidRuntime(716): at dalvik.system.NativeStart.main(Native Method) 

正在这里引发的错误:

addIcon(R.drawable.ball); 

public void addIcon(int iconResource) { 
    ivLetterIcon.setImageResource(iconResource); 
} 

错误行:

08-27 15:00:20.341: E/AndroidRuntime(760): at com.test.testing.AlpDisplay.addIcon(AlpDisplay.java:548) 
08-27 15:00:20.341: E/AndroidRuntime(760): at com.test.testing.AlpDisplay.onCreate(AlpDisplay.java:204) 

是因为我在使用模拟器吗?

我想对每个字母使用一个函数来减少程序行。

回答

1

一,我发现开发Android应用程序最常见的错误之一是

java.lang.OutOfMemoryError

首先,设置“id”属性在你的XML布局的父视图:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/RootView"> 
    ... 

然后,在Activity的onDestroy()方法中,调用unbindDrawables()方法传递父视图的引用,然后执行System.gc()。

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    unbindDrawables(findViewById(R.id.RootView)); 
    System.gc(); 
} 

private void unbindDrawables(View view) { 
    if (view.getBackground() != null) { 
     view.getBackground().setCallback(null); 
    } 
    if (view instanceof ViewGroup) { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
      unbindDrawables(((ViewGroup) view).getChildAt(i)); 
     } 
     ((ViewGroup) view).removeAllViews(); 
    } 
} 

这对我有效。我希望这有助于:)

+0

谢谢。我使用该代码。它在我的手机上工作得很好,但我使用的是7英寸屏幕的模拟器(不够幸运购买7英寸设备:/),也许这就是为什么应用程序因为内存而是FC的原因? – Si8

+0

我不认为,这是因为你的模拟器。在使用大量位图的活动中经常发生此错误。改变方向之后:Activity被销毁,再次创建,并且布局从使用可用于位图的VM存储器的XML中“膨胀”。垃圾收集器没有正确释放之前活动布局上的位图,因为它们交叉引用了它们的活动。 –

+0

我应该在我所有的活动中使用它,而不是确保它已被清除。它在我的手机上工作正常,它是4.7“,但对于7”模拟器它崩溃。 – Si8