java - Samsung Galaxy 设备内存不足

标签 java android bitmap crash launch

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

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;

}

稍后,按钮的图像将与以下似乎出现错误的数组中的图像一起显示。

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)

如果您想查看该应用程序,请访问the Playstore

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

最佳答案

如果内存不足,请将 tempList 存储在 BUTTONBACKGROUNDSRES 的成员变量或静态变量中。看起来每次您调用 BUTTONBACKGROUNDSRES 时,您都会加载一组新的 Drawable。如果它们始终相同,则从头开始频繁加载它们然后将 tempList 留给垃圾收集是没有意义的。只需创建一次列表,然后引用它。

关于java - Samsung Galaxy 设备内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26324025/

相关文章:

java - OS X Java 每个进程的最大线程数

android - 安卓移动图像

c# - 在位图上绘制旋转一定角度的线

c# - 写入位图时无法在 asp.net c# 中找到字体

c# - 通过代码C# UWP旋转位图

Java将图形绘制与swing组件结合起来

java - 在Java中插入排序的链表

java - 如何验证 Google Contacts API 的 Java 应用程序?

android - 在 Android 中手动配对蓝牙设备?

android - TextView 样式 ArrayIndexOutOfBoundsException