首页 > 解决方案 > Fragment.onCreateView 中的 OutOfMemoryError

问题描述

我的 android 应用程序在某些设备上运行良好,但在其他设备上崩溃。在我的开发者控制台上,它在 ChaptersFragment.onCreateView 中显示 OutOfMemoryError。我已经给出了下面的代码。我是新手,这是我的第一个 android 应用程序。有解决方案还是我做错了什么?

public class ChaptersFragment extends Fragment {
private CardView c1,c2,c3,c4,c5,c6,c7,c8,c9;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
ViewGroup container, @Nullable Bundle savedInstanceState) {
    View myView = inflater.inflate(R.layout.fragment_chapters, container, false);
    c1 = (CardView) myView.findViewById(R.id.chapter1);
    c2 = (CardView) myView.findViewById(R.id.chapter2);
    c3 = (CardView) myView.findViewById(R.id.chapter3);
    c4 = (CardView) myView.findViewById(R.id.chapter4);
    c5 = (CardView) myView.findViewById(R.id.chapter5);
    c6 = (CardView) myView.findViewById(R.id.chapter6);
    c7 = (CardView) myView.findViewById(R.id.chapter7);
    c8 = (CardView) myView.findViewById(R.id.chapter8);
    c9 = (CardView) myView.findViewById(R.id.chapter9);


    c1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent in = new Intent(getActivity(), Chap1.class);
            in.putExtra("some", "Introduction to Stock Markets");
            startActivity(in);
        }
    });

    c2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent in = new Intent(getActivity(), Chap2.class);
            in.putExtra("some", "Technical Analysis");
            startActivity(in);
        }
    });

    c3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent in = new Intent(getActivity(), Chap3.class);
            in.putExtra("some", "Fundamental Analysis");
            startActivity(in);
        }
    });

    c4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent in = new Intent(getActivity(), Chap4.class);
            in.putExtra("some", "Futures Trading");
            startActivity(in);
        }
    });

    c5.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent in = new Intent(getActivity(), Chap5.class);
            in.putExtra("some", "Options Theory for Professional Trading");
            startActivity(in);
        }
    });

    c6.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent in = new Intent(getActivity(), Chap6.class);
            in.putExtra("some", "Options Strategies");
            startActivity(in);
        }
    });

    c7.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent in = new Intent(getActivity(), Chap7.class);
            in.putExtra("some", "Markets and Taxation");
            startActivity(in);
        }
    });

    c8.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent in = new Intent(getActivity(), Chap8.class);
            in.putExtra("some", "Currency and Commodity Futures");
            startActivity(in);
        }
    });

    c9.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent in = new Intent(getActivity(), Chap9.class);
            in.putExtra("some", "Risk Management & Trading Psychology");
            startActivity(in);
        }
    });

    return myView;
 }
}

标签: androidout-of-memory

解决方案


当您在布局上设置图像时,渲染将尝试将其缩放到所需的大小并尝试将其容纳在您的屏幕上,在此过程中它将消耗一些内存。根据您设备上的可用内存,它很容易达到每个应用程序 Android OS 计算的最大可用内存(百分比)。

700px 可能看起来不多,但如果您在布局中加载了 9 张图像,并且系统必须将一些图像调整为较低的分辨率以适应您的屏幕,则用于处理这些图像的必要内存总和将导致内存不足错误。

这就是为什么您必须为应用程序中的每个目标设备分辨率创建多个包含不同图像大小的可绘制文件夹。不必准确,但您必须手动将图像大小调整为接近屏幕上所需的大小,以避免在渲染过程中消耗内存。

http://www.androiddocs.com/guide/practices/screens_support.html


推荐阅读