我正在为一个简单的应用程序进行原型设计,并且只有一个片段有一个活动。当用户点击下一个旋转三个屏幕时,片段会更新。
我使用dp为imageview定义了3个水平和垂直相对布局,其中每对屏幕的图像包含50dp * 50dp或150dp * 150 dp。
磁盘上的三个映像范围从200k到400k(尚无特定于分辨率的版本)。当我在ADM中查看我的应用程序内存消耗时,我发现我的应用程序以某种方式耗尽了18MB:
1-byte array [byte,bool] Count: 506, Total size:18MB
我认为这可能与android无效地缩放位图有关,因此我将资产转移到drawable-nodpi。这加速了模拟器上的渲染(奇怪的是,它们开始时是小图像),但没有影响内存分配。
要进行调试,我创建了一个不同的启动活动,而不是在按下按钮之前加载带有图像的活动。我希望我可以使用分配跟踪器来追捕问题。再一次,在开始时,应用仍然使用18MB的内存,所以我无法弄清楚它的分配位置。
有什么想法可能会发生什么?
按要求添加一些代码:
1)其中一个布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:gravity="center">
<TextView
android:id="@+id/textView"
android:text="@string/FRE_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:textAppearance="?android:attr/textAppearanceMedium"
android:editable="false"
android:autoText="false"
android:clickable="false"
android:focusable="false"
android:enabled="true"
android:padding="10dp"
/>
<ImageView
android:id="@+id/freImage1"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:src="@drawable/fre_1" />
<ImageButton
android:layout_width="40dp"
android:layout_height="40dp"
android:id="@+id/imageButton"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="@drawable/right_arrow" />
<Button
android:id="@+id/buttonGetStarted"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Get_started"
android:layout_alignParentBottom="true"
android:layout_centerInParent="true"
android:onClick="LoadLogin" />
</RelativeLayout>
活动基于标准模板,核心部分为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.intro_main); //this loads the xml layout file
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
Log.i(myApp, "IntroMain:OnCreate");
}
在FRE片段中交换逻辑:
public static FREFragment newInstance(int sectionNumber) {
FREFragment fragment = new FREFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public FREFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mNum = getArguments().getInt(ARG_SECTION_NUMBER); //figure out which page we're on
View rootView;
if (mNum == 1) {
rootView = inflater.inflate(R.layout.fragment_fre1, container, false);
Log.i(myApp, "IntroMain:onCreateView:Started:1");
} else if (mNum == 2) {
rootView = inflater.inflate(R.layout.fragment_fre2, container, false);
Log.i(myApp, "IntroMain:onCreateView:Started:2");
} else {
rootView = inflater.inflate(R.layout.fragment_fre3, container, false);
Log.i(myApp, "IntroMain:onCreateView:Started:3");
}
return rootView;
}