Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java App FC关于可提取资源的再利用_Java_Android - Fatal编程技术网

Java App FC关于可提取资源的再利用

Java App FC关于可提取资源的再利用,java,android,Java,Android,第一次加载带有代码的活动时,一切正常。我可以选择字母A,然后返回到上一个活动,然后返回字母A,并继续这样做,我的应用程序不起作用,但当我选择字母B或字母A我的应用程序功能旁边的任何其他字母时 我的LogCat显示以下内容: if (someId.matches("A") || someId.matches("a")) { addLetters(); addIcon(R.drawable.apple); addSentence("A is f

第一次加载带有代码的活动时,一切正常。我可以选择字母
A
,然后返回到上一个活动,然后返回字母
A
,并继续这样做,我的应用程序不起作用,但当我选择字母
B
或字母
A
我的应用程序功能旁边的任何其他字母时

我的LogCat显示以下内容:

    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);
}
此处将抛出错误:

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)

错误行:

public void addIcon(int iconResource) {
    ivLetterIcon.setImageResource(iconResource);
}
是因为我在使用模拟器吗


我正在尝试对每个字母使用一个函数来减少程序行。

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

java.lang.OutOfMemoryError

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

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)

...
然后,在活动的onDestroy()方法上,调用unbindDrawables()方法传递对父视图的引用,然后执行System.gc()

@覆盖
受保护的空onDestroy(){
super.ondestory();
不可绑定的drawables(findviewbyd(R.id.RootView));
gc();
}
私有void未绑定可提取项(视图){
if(view.getBackground()!=null){
view.getBackground().setCallback(null);
}
if(视图组的视图实例){
对于(int i=0;i<((视图组)视图)。getChildCount();i++){
未绑定的Drawables(((视图组)视图).getChildAt(i));
}
((视图组)视图);
}
}

这对我有用。我希望这有帮助:)

谢谢。我用了那个密码。它在我的手机上运行得很好,但我正在使用7英寸屏幕的仿真器(没有幸运地购买7英寸设备:/),也许这就是为什么应用程序是FC,因为内存?我不认为,这是因为你的仿真器。此错误在使用大量位图的活动中经常发生。改变方向后:活动被销毁,再次创建,布局从消耗位图可用VM内存的XML中“膨胀”。垃圾回收器未正确释放上一个活动布局上的位图,因为它们交叉引用了其活动。我应该在我的所有活动上使用位图,而不是确保它被清除。它在我4.7英寸的手机上运行良好,但是在7英寸的模拟器上它崩溃了。我真的认为它是我的模拟器。虽然我使用了unBind方法,但是这些函数上出现了java.lang.OutOfMemory错误。检查这个
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)
<?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">
    ...
@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();
    }
}