Android应用内存 - 位图还是内存泄漏?

时间:2014-12-15 21:26:18

标签: android

我正在为一个简单的应用程序进行原型设计,并且只有一个片段有一个活动。当用户点击下一个旋转三个屏幕时,片段会更新。

我使用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;
}

0 个答案:

没有答案