Недостаточно памяти .. Приложение начинается с 10 Мб памяти - PullRequest
0 голосов
/ 28 января 2012

Я создал приложение для вкладки galaxy, используя фрагменты для отображения около 55 страниц. Большинство из них являются растровыми изображениями, а остальные - динамическими страницами (с использованием рисования).Когда я запускаю приложение, оно потребляет около 10 МБ, а затем продолжает расти, как 2 МБ на страницу.Когда он достигает примерно страницы 40, он вылетает с ошибкой «Недостаточно памяти» (около 55 МБ).

Вот код моей основной деятельности и фрагмент.

package com.example.hscroll.demo;

import java.util.List;
import java.util.Vector;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerAdapter;

import com.example.hscroll.library.imagezoom.ImageViewTouch;

public class MainAct extends FragmentActivity{

private PagerAdapter mPagerAdapter;
private CustomViewPager viewPager;

//public static int PAGE_NUMBER = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);     

    super.setContentView(R.layout.viewpager_layout);
    this.initialisePaging();        
}

private void initialisePaging()
{
    List<Fragment> fragments = new Vector<Fragment>();
    fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
    fragments.add(Fragment.instantiate(this, FragmentSignupForm.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment2.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment3.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment4.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment5.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment6.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment7.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment8.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment9.class.getName()));
    fragments.add(Fragment.instantiate(this, MainFragmentActivity.class.getName()));
    fragments.add(Fragment.instantiate(this, FragmentQuestionaire.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment10.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment11.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment12.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment13.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment14.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment15.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment16.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment17.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment18.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment19.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment20.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment21.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment22.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment23.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment24.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment25.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment26.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment27.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment28.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment29.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment30.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment31.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment32.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment33.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment34.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment35.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment36.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment37.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment38.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment39.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment40.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment41.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment42.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment43.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment44.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment45.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment46.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment47.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment48.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment49.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment50.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment51.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment52.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment53.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment53.class.getName()));
    fragments.add(Fragment.instantiate(this, Fragment54.class.getName()));


    this.mPagerAdapter = new MyPagerAdapter(super.getSupportFragmentManager(),fragments);

    viewPager = (CustomViewPager)findViewById(R.id.viewpager);
    viewPager.setAdapter(this.mPagerAdapter);   
    ImageViewTouch.customViewPager = viewPager;
}
}

Фрагмент - -

package com.example.hscroll.demo;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.example.hscroll.library.imagezoom.ImageViewTouch;

public class Fragment2 extends Fragment{

ImageViewTouch imgview ;
LayoutInflater inflater;
FileInputStream in;
BufferedInputStream buf;
Bitmap bitmap;

private final String  PATH = "/mnt/sdcard/Ideal Solar/Layout_1.png";

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance)
{
    this.inflater = inflater;
    if(container == null)return null;
    container = (LinearLayout)inflater.inflate(R.layout.fragment0_layout, container, false);

    imgview= (ImageViewTouch)container.findViewById(R.id.imageView1);
    bitmap = SelectImageFunctions.selectImage(inflater.getContext(), PATH);
    if(bitmap!=null)
        imgview.setImageBitmapReset( bitmap, true );

    return container;
}   

 @Override
    public void onResume() {

        if(bitmap == null)
        {
            bitmap = SelectImageFunctions.selectImage(inflater.getContext(), PATH);
        }
        super.onResume();
    }

 @Override
    public void onDestroyView() {
         bitmap.recycle();
            bitmap = null;
         super.onDestroyView();
    }    
}

Я использую эту библиотеку для применения масштабирования, прокрутки и т. Д. К изображениям / страницам.

Спасибо

Ответы [ 2 ]

3 голосов
/ 22 октября 2012

в файле манифеста добавить android: largeHeap = "true" сущность.Благодаря этому приложение может выделять больший размер из кучи.

 <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
    android:largeHeap="true" >
0 голосов
/ 29 января 2012

К сожалению, существует жесткое ограничение на объем памяти, который может использовать код Java в Android. На самом деле есть два жестких ограничения: общее использование кучи объектов Java и использование растровых изображений. Кажется, каждый из них занимает около 20 МБ (возможно, больше на новых устройствах с большим объемом оперативной памяти). Существует опция no для настройки этих пределов, доступных разработчику или пользователю (по крайней мере, на некорневом устройстве).

Интересно, что эти ограничения не применяются к нативному коду. Это бесплатно потребляет столько оперативной памяти, сколько ей хочется, пока система не начнет убивать процессы и не перейдет к той, которая жует всю оперативную память.

...