Android垂直滚动视图内存不足错误



我正在创建一个Android应用程序(Android Studio),它显示一个垂直滚动视图,其中包含许多文本视图和图像视图(一页上大约40个)。请参阅下面的.xml文件。这段代码只显示了其中的3个重复模式,但我的代码包含了更多的重复模式——删除了这些模式以缩短这篇文章的长度。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/smiles_background"
    tools:context="com.mobilewebanalytiq.forkshappyhour.monday">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Search by Day"
        android:id="@+id/tvnumber"
        android:layout_gravity="right"
        android:layout_marginTop="5dp"
        android:layout_marginRight="10dp"
        android:textColor="#ff000000" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Monday"
        android:id="@+id/tvday"
        android:textSize="30dp"
        android:textColor="#ff000000"
        android:layout_marginLeft="10dp" />
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/scrollView3" >
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:text="Large Text"
                android:id="@+id/textView401"
                android:layout_marginTop="10dp"
                android:layout_gravity="center_horizontal"
                android:textSize="30dp" />
            <ImageView
                android:layout_width="300dp"
                android:layout_height="300dp"
                android:id="@+id/imageView401"
                android:layout_gravity="center_horizontal"
                android:src="@drawable/sunday1" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:text="Large Text"
                android:id="@+id/textView402"
                android:layout_marginTop="10dp"
                android:layout_gravity="center_horizontal"
                android:textSize="30dp" />
            <ImageView
                android:layout_width="300dp"
                android:layout_height="300dp"
                android:id="@+id/imageView402"
                android:layout_gravity="center_horizontal"
                android:src="@drawable/sunday2" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:text="Large Text"
                android:id="@+id/textView403"
                android:layout_marginTop="10dp"
                android:layout_gravity="center_horizontal"
                android:textSize="30dp" />
            <ImageView
                android:layout_width="300dp"
                android:layout_height="300dp"
                android:id="@+id/imageView403"
                android:layout_gravity="center_horizontal"
                android:src="@drawable/sunday3" />
            
            //This will continue on for many lines
            
        </LinearLayout>
    </ScrollView>
</LinearLayout>

不出所料,当我打开此页面时,应用程序将崩溃。重新设计这个.xml以使应用程序不再崩溃的最佳方法是什么?我应该使用不同的布局,还是有办法优化这个代码?正如你所看到的,我正在从@drawable文件夹中提取,但也许使用另一个位置会有所帮助。下面是.java文件以供参考。非常感谢您的详细帮助!

package com.mobilewebanalytiq.forkshappyhour;
import android.app.Activity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ViewFlipper;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
/**
 * Created by Matt on 2/8/2015.
 */
public class monday extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.monday);
    }}

您应该考虑使用ListView,这样您的所有图像就不会立即加载,并且项目可以"回收"

即便如此,你也可能会遇到问题。不管怎样,你的drawables可能太大了。您应该考虑根据显示所需的大小加载它们。请参阅安卓文档:

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

由于可用内存有限,您将无法直接引用每个图像,否则就像您所说的那样,您将耗尽内存。只要有对BitMap对象的引用,这些图像就会占用内存中的空间。要释放此内存,您需要取消引用这些BitMaps和/或清除ArrayList,这将允许垃圾回收器释放未使用的内存。理想情况下,你只想参考你能看到的图像,或者你接下来会看到的图像。

您可以只查找每个页面视图的8个图像,也可以查找周围页面视图中的图像。如果您显示的图像比它们所占的大小大得多,那么您可能需要动态调整这些图像的大小,并仅按它们显示的大小存储它们,这也有助于减少图像的内存占用。

Android开发人员就这个主题编写了一系列教程:http://developer.android.com/training/displaying-bitmaps/index.html

最新更新