Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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 我刚刚加载了22个drawables,为什么OutOfMemoryError?_Java_Android_Image_Out Of Memory - Fatal编程技术网

Java 我刚刚加载了22个drawables,为什么OutOfMemoryError?

Java 我刚刚加载了22个drawables,为什么OutOfMemoryError?,java,android,image,out-of-memory,Java,Android,Image,Out Of Memory,我正在编写一个Android应用程序,帮助小孩子学习数学。用户可以选择一些问题选项并回答问题。如果他/她正确回答了所有问题,他/她可以获得奖励。每个问题选项都有不同的奖励。有22个不同的问题选项。我在网上找到了22张图片,并把它们放在我的绘图文件夹中。然后我写了一个满是地图的类,叫做QuestionOptionMaps。在这里,希望你知道我想在这里做什么: package com.smartkidslovemaths.util; import com.smartkidslovemaths.Qu

我正在编写一个Android应用程序,帮助小孩子学习数学。用户可以选择一些问题选项并回答问题。如果他/她正确回答了所有问题,他/她可以获得奖励。每个问题选项都有不同的奖励。有22个不同的问题选项。我在网上找到了22张图片,并把它们放在我的绘图文件夹中。然后我写了一个满是地图的类,叫做
QuestionOptionMaps
。在这里,希望你知道我想在这里做什么:

package com.smartkidslovemaths.util;

import com.smartkidslovemaths.QuestionOptions;
import com.smartkidslovemaths.R;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

public class QuestionOptionMaps {

    private QuestionOptionMaps () {}

    public static ArrayList<QuestionOptions> getOptionsList() {
        return optionsList;
    }

    public static HashMap<QuestionOptions, Integer> getOptionsDrawableMap() {
        return optionsDrawableMap;
    }

    public static HashMap<QuestionOptions, String> getOptionsKeysMap() {
        return optionsKeysMap;
    }

    public static HashMap<QuestionOptions, Integer> getOptionsTimerMap() {
        return optionsTimerMap;
    }

    private static ArrayList<QuestionOptions> optionsList;
    private static HashMap<QuestionOptions, Integer> optionsDrawableMap;
    private static HashMap<QuestionOptions, String> optionsKeysMap;
    private static HashMap<QuestionOptions, Integer> optionsTimerMap;

    static {
        optionsList = new ArrayList<> ();
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.ADDITION, 1, false));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.ADDITION, 2, false));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.ADDITION, 3, false));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.ADDITION, 1, true));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.ADDITION, 2, true));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.ADDITION, 3, true));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.SUBTRACTION, 1, false));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.SUBTRACTION, 2, false));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.SUBTRACTION, 3, false));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.SUBTRACTION, 1, true));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.SUBTRACTION, 2, true));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.SUBTRACTION, 3, true));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.ADD_AND_SUB, 1, false));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.ADD_AND_SUB, 2, false));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.ADD_AND_SUB, 3, false));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.ADD_AND_SUB, 1, true));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.ADD_AND_SUB, 2, true));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.ADD_AND_SUB, 3, true));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.MULTIPLICATION, 1, false));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.MULTIPLICATION, 2, false));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.MULTIPLICATION, 1, true));
        optionsList.add (new QuestionOptions (QuestionOptions.OperationType.MULTIPLICATION, 2, true));

        ArrayList<String> prefKeyArray = new ArrayList<> ();
        prefKeyArray.add ("p110");
        prefKeyArray.add ("p120");
        prefKeyArray.add ("p130");
        prefKeyArray.add ("p111");
        prefKeyArray.add ("p121");
        prefKeyArray.add ("p131");
        prefKeyArray.add ("p210");
        prefKeyArray.add ("p220");
        prefKeyArray.add ("p230");
        prefKeyArray.add ("p211");
        prefKeyArray.add ("p221");
        prefKeyArray.add ("p231");
        prefKeyArray.add ("p310");
        prefKeyArray.add ("p320");
        prefKeyArray.add ("p330");
        prefKeyArray.add ("p311");
        prefKeyArray.add ("p321");
        prefKeyArray.add ("p331");
        prefKeyArray.add ("p410");
        prefKeyArray.add ("p420");
        prefKeyArray.add ("p411");
        prefKeyArray.add ("p421");
        optionsKeysMap = getHashMapFromCollections (optionsList, prefKeyArray);

        ArrayList<Integer> idArray = new ArrayList<> ();
        idArray.add (R.drawable.p110);
        idArray.add (R.drawable.p120);
        idArray.add (R.drawable.p130);
        idArray.add (R.drawable.p111);
        idArray.add (R.drawable.p121);
        idArray.add (R.drawable.p131);
        idArray.add (R.drawable.p210);
        idArray.add (R.drawable.p220);
        idArray.add (R.drawable.p230);
        idArray.add (R.drawable.p211);
        idArray.add (R.drawable.p221);
        idArray.add (R.drawable.p231);
        idArray.add (R.drawable.p310);
        idArray.add (R.drawable.p320);
        idArray.add (R.drawable.p330);
        idArray.add (R.drawable.p311);
        idArray.add (R.drawable.p321);
        idArray.add (R.drawable.p331);
        idArray.add (R.drawable.p410);
        idArray.add (R.drawable.p420);
        idArray.add (R.drawable.p411);
        idArray.add (R.drawable.p421);
        optionsDrawableMap = getHashMapFromCollections (optionsList, idArray);

        //TODO initialize the collections
    }

    private static <K, V> HashMap<K, V> getHashMapFromCollections (Collection<K> keys, Collection<V> values) {
        if (keys.size () != values.size ())
            throw new AssertionError ();
        HashMap<K, V> map = new HashMap<> ();
        K[] keyArray = (K[])keys.toArray ();
        V[] valueArray = (V[])values.toArray ();
        for (int i = 0 ; i < keys.size () ; i++) {
            map.put (keyArray[i], valueArray[i]);
        }
        return map;
    }
}
下面是我添加视图的方式:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate (savedInstanceState);
    setContentView (R.layout.activity_prize);
    for (QuestionOptions option : QuestionOptionMaps.getOptionsList ()) {
        displayAPrize (option);
    }
}

private void displayAPrize (QuestionOptions options) {
    Resources res = getResources ();
    int parentMargin = (int)res.getDimension (R.dimen.prize_display_margin);
    LinearLayout.LayoutParams parentParams =
            new LinearLayout.LayoutParams (ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
    parentParams.setMargins (parentMargin, parentMargin, parentMargin, parentMargin);

    LinearLayout.LayoutParams imageParams =
            new LinearLayout.LayoutParams (
                    ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT
            );

    LinearLayout parent = new LinearLayout (this);
    parent.setLayoutParams (parentParams);
    parent.setOrientation (LinearLayout.VERTICAL);


    ImageView image = new ImageView (this);
    image.setLayoutParams (imageParams);
    int imageId = QuestionOptionMaps.getOptionsDrawableMap ().get (options);
    image.setImageResource (imageId);
    parent.addView (image);

    TextView text = new TextView (this);
    text.setLayoutParams (imageParams);
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences (this);
    String key = QuestionOptionMaps.getOptionsKeysMap ().get (options);
    int prizeCount = prefs.getInt (key, 0);
    text.setText ("x" + prizeCount);
    parent.addView (text);

    ((LinearLayout)findViewById (R.id.trophy_content)).addView (parent);
}
当我运行应用程序时,它崩溃了,出现了一个
OutOfMemoryError
!以下是调用堆栈:

java.lang.OutOfMemoryError
        at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:503)
        at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:356)
        at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:816)
        at android.content.res.Resources.loadDrawable(Resources.java:2117)
        at android.content.res.Resources.getDrawable(Resources.java:702)
        at android.widget.ImageView.resolveUri(ImageView.java:636)
        at android.widget.ImageView.setImageResource(ImageView.java:365)
        at com.smartkidslovemaths.PrizeActivity.displayAPrize(PrizeActivity.java:46)
        at com.smartkidslovemaths.PrizeActivity.onCreate(PrizeActivity.java:22)
        at android.app.Activity.performCreate(Activity.java:5133)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2230)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
        at android.app.ActivityThread.access$600(ActivityThread.java:150)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:213)
        at android.app.ActivityThread.main(ActivityThread.java:5225)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
        at dalvik.system.NativeStart.main(Native Method)
第46行是这一行:

image.setImageResource (imageId);

我真的不明白为什么会这样。其他应用程序有更多的图像,为什么它们不会崩溃?有什么办法可以解决这个问题吗?

在清单文件的
应用程序中添加
android:largeHeap=“true”

然后再试一次

但不建议采用这种方式。看看下面的帖子


  • 在清单文件的
    应用程序中添加
    android:largeHeap=“true”

    然后再试一次

    但不建议采用这种方式。看看下面的帖子


  • 我觉得你的拖带分辨率更高。您必须降低其分辨率,或者可以使用以下替代解决方案

    <application
        ....
           android:largeHeap="true"> 
    


    我希望它能对您有所帮助。

    我认为您的拖带分辨率更高。您必须降低其分辨率,或者可以使用以下替代解决方案

    <application
        ....
           android:largeHeap="true"> 
    


    我希望它能对您有所帮助。

    图像有多大也很重要。@Karakuri它们总共有1.9 MB。再一次,图像文件的大小并不重要。它们的尺寸很重要,因为它定义了内存中位图的大小。它们的长宽约为800px。我认为分辨率太低的图像在手机屏幕上会显得模糊,因为像素太密集@njzk2@Sweeper只要浏览这个链接,你就会有解决这个问题的想法。。图像的大小也很重要。@Karakuri它们总共是1.9 MB。再一次,图像文件的大小并不重要。它们的尺寸很重要,因为它定义了内存中位图的大小。它们的长宽约为800px。我认为分辨率太低的图像在手机屏幕上会显得模糊,因为像素太密集@njzk2@Sweeper只要浏览这个链接,你就会有解决这个问题的想法。。这当然不是一个好的解决方案,因为它无法解决问题的原因,因此即使堆更大,您也可能再次遇到相同的问题。@Karakuri它无法解决问题的原因-异常本身表示
    OutOfMemoryError
    。我想孩子们也能理解这个词的含义。Opp问有没有办法解决这个问题?。因此,我提供了可能的解决方案,并且解释了为什么不推荐它。“现在我被连线了,你怎么说这肯定不是一个好的解决方案呢?”Gunaseelan因为如果他的代码在处理位图的方式上有问题,那么这个问题仍然存在,而且他以后可能会遇到同样的错误,即使堆更大。这可能需要更长的时间,但仍然可能发生,因为他的实际问题没有得到解决。他的应用程序正在填满内存,不允许回收任何(或足够的)内存;你只是给了他更多的内存来填充。这肯定不是一个好的解决方案,因为它不能解决问题的原因,所以即使堆更大,你也可能再次遇到相同的问题。@Karakuri它不能解决问题的原因-异常本身说
    OutOfMemoryError
    。我想孩子们也能理解这个词的含义。Opp问有没有办法解决这个问题?。因此,我提供了可能的解决方案,并且解释了为什么不推荐它。“现在我被连线了,你怎么说这肯定不是一个好的解决方案呢?”Gunaseelan因为如果他的代码在处理位图的方式上有问题,那么这个问题仍然存在,而且他以后可能会遇到同样的错误,即使堆更大。这可能需要更长的时间,但仍然可能发生,因为他的实际问题没有得到解决。他的应用程序正在填满内存,不允许回收任何(或足够的)内存;你只是给了他更多的记忆。