Java 我刚刚加载了22个drawables,为什么OutOfMemoryError?
我正在编写一个Android应用程序,帮助小孩子学习数学。用户可以选择一些问题选项并回答问题。如果他/她正确回答了所有问题,他/她可以获得奖励。每个问题选项都有不同的奖励。有22个不同的问题选项。我在网上找到了22张图片,并把它们放在我的绘图文件夹中。然后我写了一个满是地图的类,叫做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
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因为如果他的代码在处理位图的方式上有问题,那么这个问题仍然存在,而且他以后可能会遇到同样的错误,即使堆更大。这可能需要更长的时间,但仍然可能发生,因为他的实际问题没有得到解决。他的应用程序正在填满内存,不允许回收任何(或足够的)内存;你只是给了他更多的记忆。