【问题标题】:Android Vertical Scrollview Out of Memory ErrorAndroid 垂直滚动视图内存不足错误
【发布时间】:2015-04-12 18:32:55
【问题描述】:

我正在创建一个 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);


    }}

【问题讨论】:

  • 为什么不使用列表视图而不是滚动视图?您的OutOfMemory 错误是因为您的图像视图使用的位图。

标签: android out-of-memory scrollview lazy-loading vertical-scrolling


【解决方案1】:

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

即便如此,您也可能会遇到问题。无论哪种方式,您的drawables 都可能太大了。您应该考虑根据显示所需的大小来加载它们。请参阅 Android 文档:

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

【讨论】:

    【解决方案2】:

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

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

    Android 开发者已经写了一系列关于这个主题的教程:http://developer.android.com/training/displaying-bitmaps/index.html

    【讨论】:

      猜你喜欢
      • 2013-07-18
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多