内存不足问题..以 10mb 内存启动的应用程序

发布于 2024-12-29 11:12:33 字数 7245 浏览 6 评论 0原文

我已经使用片段为 Galaxy 选项卡构建了一个应用程序来显示大约 55 个页面。其中大多数是位图,其余的是动态页面(使用可绘制对象)。当我启动应用程序时,它消耗大约 10mb,然后它会继续增加,比如每页 2mb。当它到达大约第 40 页时,它会因内存不足错误(大约 55MB)而崩溃。

这是我的主要活动的代码和一个片段。

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

我正在使用 这个 库来应用图像/页面上的缩放、滚动等。

谢谢

I have built a app for galaxy tab using fragments to display around 55 pages.Most of them are bitmaps and rest are dynamic pages(using drawables). When i start the app it consumes around 10mb and then it keep on increasing like 2 mb per page. When it reaches to around page number 40 it crashes with Out of memory error(Around 55MB).

Here is the code of my main activity and a fragment.

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

Fragment - -

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

I am using this library to apply zoom,scroll etc on images/pages.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

jJeQQOZ5 2025-01-05 11:12:33

在清单文件中添加 android:largeHeap="true" 实体。
感谢该应用程序可以从堆中分配更多的大小。

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

in manifest file add android:largeHeap="true" entity.
thanks to that application can allocate more size from heap.

 <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
    android:largeHeap="true" >
热情消退 2025-01-05 11:12:33

不幸的是,Java 代码可以在 Android 中使用多少内存是有硬性限制的。实际上有两个硬性限制:一般Java对象堆的使用和位图的使用。每个似乎都在 20MB 左右(在 RAM 更多的新设备上可能更大)。开发人员或用户(至少在未 root 的设备上)没有可用的选项来调整这些限制。

有趣的是,这些限制不适用于本机代码。它可以随意消耗尽可能多的 RAM,直到系统开始杀死进程,并开始消耗所有 RAM。

Unfortunately, there is a hard limit on how much memory Java code can use in Android. Actually there are two hard limits: general Java object heap usage, and bitmap usage. Each seems to be around 20MB (possibly more on newer devices with more RAM). There is no option for adjusting these limits available to the developer or user (at least on an unrooted device).

Interestingly, these limits do not apply to native code. That is free to consume as much RAM as it likes, until the system starts killing off processes, and gets round to the one chewing all the RAM.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文