Dan*_*ykt 4 memory layout android memory-management image
我正在开发一个Android应用程序,当我四处阅读并为自己学习时,我不能同时在屏幕上有很多图像,否则我将得到一个例外.
问题是图像中有多少图像或多少KB,或者我可以在屏幕上同时有多少布局/图像.
我知道这不是影响记忆的唯一因素,但我正在寻找一个数字,所以我可以计划一下.
谢谢
丹尼尔
编辑:
我刚刚在android开发网站上找到了这个(http://developer.android.com/resources/articles/future-proofing.html)
要避免的技术,#3:过度使用布局
由于View渲染基础架构的变化,布局中不合理的深度(超过10个左右)或宽度(总共超过30个)视图层次结构现在可能导致崩溃.这对于过于复杂的布局总是存在风险,但是在暴露这个问题时你可以认为Android 1.5优于1.1.大多数开发人员不需要担心这一点,但如果您的应用程序具有非常复杂的布局,则需要节省时间.您可以使用更高级的布局类(如FrameLayout和TableLayout)来简化布局.
我想这可能是我的问题.
当它说"广泛"时,是否在最后一级说?
谢谢
丹尼尔
我发现开发Android应用程序的最常见错误之一是
java.lang.OutOfMemoryError: Bitmap Size Exceeds VM Budget 错误.
我在更改方向后使用大量位图的活动经常发现此错误:活动被销毁,再次创建,布局从消耗可用于位图的VM内存的XML中"膨胀".
前一个活动布局上的位图未被垃圾收集器正确释放,因为它们已经交叉引用了它们的活动.经过多次实验,我发现了一个很好的解决方案.
首先,在XML布局的父视图上设置id属性:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/RootView"
>
...
Run Code Online (Sandbox Code Playgroud)
然后,在onDestroy() Activity 的方法上,调用unbindDrawables()方法将refence传递给父View,然后执行System.gc()
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(R.id.RootView));
System.gc();
}
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
Run Code Online (Sandbox Code Playgroud)
这个unbindDrawables()方法以递归方式探索视图树,并且:
| 归档时间: |
|
| 查看次数: |
13641 次 |
| 最近记录: |