Java 三星Galaxy设备内存不足

Java 三星Galaxy设备内存不足,java,android,bitmap,crash,launch,Java,Android,Bitmap,Crash,Launch,我真的尽了最大的努力,但我就是找不到解决这个问题的办法。 我为Android设备编写了一个音板,其中每个声音以及按钮图像都是动态加载的。 以下是我的代码中的关键段落: private void loadButtonColors(){ int rescount = AppConfig.BUTTONBACKGROUNDSRES(getApplicationContext()).size(); SharedPreferences prefs = getSharedPreferences

我真的尽了最大的努力,但我就是找不到解决这个问题的办法。 我为Android设备编写了一个音板,其中每个声音以及按钮图像都是动态加载的。 以下是我的代码中的关键段落:

private void loadButtonColors(){
    int rescount = AppConfig.BUTTONBACKGROUNDSRES(getApplicationContext()).size();
    SharedPreferences prefs = getSharedPreferences("buttoncolors", 0);
    String colors = null;
    colors = prefs.getString("colors", null);
    List<String> tempList = new ArrayList<String>();
    if(colors != null){
        tempList.addAll(Arrays.asList(TextUtils.split(colors, "~")));
    }
    if(colors == null || tempList.size() != MainActivity.SOUNDBUTTONS.size()){
        for(@SuppressWarnings("unused") SoundButton s : MainActivity.SOUNDBUTTONS){
            int randomint = new Random().nextInt(rescount);
            Integer randominteger = Integer.valueOf(randomint);
            String randomstring = String.valueOf(randominteger);

            tempList.add(randomstring);
        }

        prefs.edit().putString("colors", TextUtils.join("~", tempList)).commit();



    }

    MainActivity.BUTTONCOLORS = (ArrayList<String>) tempList;

}
如果您想查看应用程序,请访问


编辑:每个按钮图像的大小约为70kb。

如果内存不足,请将模板列表存储在ButtonBackgrounds中的成员或静态变量中。看起来每次你调用ButtonBackgrounds时,你都要加载一套新的抽绳。如果这些都是相同的,那么频繁地从零开始加载它们,然后让圣殿骑士被垃圾收集是没有意义的。只需创建一次列表,然后引用它

你的按钮图像有多大?每个图像大约有70kb是压缩的还是未压缩的?为什么你会从R.color中得到一个可绘制的图像?你真的需要储存抽屉吗?我应该从哪里取来?
public static ArrayList<Drawable> BUTTONBACKGROUNDSRES(Context context){
    ArrayList<Drawable> tempList = new ArrayList<Drawable>();
    tempList.add(context.getResources().getDrawable(R.color.button_lblue));
    tempList.add(context.getResources().getDrawable(R.color.button_lime));
    tempList.add(context.getResources().getDrawable(R.color.button_orange));
    tempList.add(context.getResources().getDrawable(R.color.button_pink));
    tempList.add(context.getResources().getDrawable(R.color.button_red));
    tempList.add(context.getResources().getDrawable(R.color.button_yellow));
    return tempList;
};
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
at android.content.res.Resources.loadDrawable(Resources.java:2150)
at android.content.res.Resources.getDrawable(Resources.java:715)
at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)
at android.content.res.Resources.loadDrawable(Resources.java:2132)
at android.content.res.Resources.getDrawable(Resources.java:715)
at com.centivo.inscope21soundboard.AppConfig.BUTTONBACKGROUNDSRES(AppConfig.java:45)
at com.centivo.inscope21soundboard.LauncherActivity.loadButtonColors(LauncherActivity.java:128)
at com.centivo.inscope21soundboard.LauncherActivity.access$1(LauncherActivity.java:127)
at com.centivo.inscope21soundboard.LauncherActivity$1.run(LauncherActivity.java:43)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5105)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
at dalvik.system.NativeStart.main(Native Method)