android - 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;
}
}
解决方案
当您在布局上设置图像时,渲染将尝试将其缩放到所需的大小并尝试将其容纳在您的屏幕上,在此过程中它将消耗一些内存。根据您设备上的可用内存,它很容易达到每个应用程序 Android OS 计算的最大可用内存(百分比)。
700px 可能看起来不多,但如果您在布局中加载了 9 张图像,并且系统必须将一些图像调整为较低的分辨率以适应您的屏幕,则用于处理这些图像的必要内存总和将导致内存不足错误。
这就是为什么您必须为应用程序中的每个目标设备分辨率创建多个包含不同图像大小的可绘制文件夹。不必准确,但您必须手动将图像大小调整为接近屏幕上所需的大小,以避免在渲染过程中消耗内存。
http://www.androiddocs.com/guide/practices/screens_support.html
推荐阅读
- python - 如何使用来自另一个 csv 的信息更新 csv 的一个元素?
- android - Android:AudioRecord 和 DynamicsProcessing
- ios - 阿拉伯语本地化改变方向
- javascript - 以匿名模式反应本机打开的Firefox浏览器
- javascript - 将 .constructor.name 指定为任意字符串
- ios - 锁定屏幕上的音频播放器控件
- javascript - 为其他 Webpack 包重新导出捆绑的 React
- powershell - Sources\SxS”文件夹从哪里获得?
- c# - c#在mongo中聚合
- r - 自定义 ggplot2 图例