0

フラクタルを使って55ページを表示する銀河タブのアプリケーションを作成しました。それらのほとんどはビットマップであり、残りは動的ページ(ドロワーブルを使用)です。私はアプリを起動すると約10MBを消費し、ページあたり2MBのように増加し続けます。ページ番号40に達すると、メモリ不足エラー(約55MB)でクラッシュします。メモリ不足問題​​... 10MBのメモリから始まるアプリケーション

私の主な活動とその断片のコードです。

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(); 
    }  
} 

私は、ズームを適用した画像/ページにスクロールするなどthisライブラリを使用しています。

おかげ

+0

このトピックでは、多くの質問があります。ここに1つのリンクがありますhttp://stackoverflow.com/questions/5697760/android-out-of-memory-exception-when-creating-bitmap – kosa

+0

これらのリンクはすべて、サーバからイメージを取得する際の問題ですが、私のイメージはsdにありますカード。 – Khushwant

+0

違いはありません。あなたがそれらと連動するとき、彼らは彼らがどこにいるかにかかわらずメモリにロードされます。 – kosa

答えて

0

は残念ながら、Javaコードは、Androidで使用することができますどのくらいのメモリ上のハード限界があります。実際には、一般的なJavaオブジェクトヒープの使用法とビットマップの使用という2つの厳しい制限があります。それぞれの容量は約20MBになります(おそらく、より多くのRAMを搭載した新しいデバイスではさらに多くなります)。これらの制限を開発者またはユーザーが利用できるように調整するには、オプションがあります(少なくともルーティングされていないデバイスでは)。

興味深いことに、これらの制限はネイティブコードには適用されません。これは、システムがプロセスを強制終了するまで、それが好きなだけ多くのRAMを消費することができ、すべてのRAMを噛んでいるものに丸みを出す。

3

マニフェストファイルの追加android:largeHeap = "true"エンティティ。 そのアプリケーションのおかげで、ヒープからさらに多くのサイズを割り当てることができます。

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 
    android:largeHeap="true" >