Android的ViewPager与图像:内存泄漏/应用程序崩溃 [英] Android ViewPager with images: memory leak/app crashes

查看:1234
本文介绍了Android的ViewPager与图像:内存泄漏/应用程序崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写一个应用程序,显示全景图像,最终有几个标志上显示有关的某些点的信息。

由于大图片坠毁的应用程序(我也曾经在被显示大地图应用程序的另一个活动),我现在想显示的全景与ViewPager序列的页面。

我已成功地在6位显示的画面,我以为事情进展顺利,但现在经过几次刷卡(约7〜8)内存耗尽,应用程序崩溃

我拉我的头发,为什么说是因为我以为我的项目将被摧毁,一旦他们离开屏幕? 我是一个绝对的菜鸟,我很抱歉,如果我是一个浪费时间。我花了一整天的阅读,并试图从这里和其他地方的解决方案,我毫无收获。

这是我的code: 活动PanoramaView

 公共类PanoramaView延伸活动{

@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.panorama);
    MyPagerAdapter适配器=新MyPagerAdapter();
    ViewPager myPager =(ViewPager)findViewById(R.id.mysixpanelpager);
    myPager.setAdapter(适配器);
    myPager.setCurrentItem(2);
}


}
 

MyPagerAdapter

 公共类MyPagerAdapter扩展PagerAdapter {
    公众诠释getCount将(){
        返回6;
    }
    公共对象instantiateItem(查看收集,INT位置){
        LayoutInflater充气=(LayoutInflater)collection.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        INT渣油= 0;
        开关(位置){
        情况下0:
            渣油= R.layout.farleft;
            打破;
        情况1:
            渣油= R.layout.left;
            打破;
        案例2:
            渣油= R.layout.middle;
            打破;
        案例3:
            渣油= R.layout.right;
            打破;
        壳体4:
            渣油= R.layout.farright;
            打破;
        壳体5:
            渣油= R.layout.farfarright;
            打破;
        }
        // ImageView的ImageView的=新ImageView的(getApplicationContext());
        //imageView.findViewById(R.id.imageView);
        //imageView.setImageBitmap(BitmapFactory.de codeResource(getResources(),IDS [位置]));

        查看查看= inflater.inflate(渣油,NULL);
        ((ViewPager)集合).addView(查看,0);
        返回查看;
    }
    @覆盖
    公共无效destroyItem(查看收集,INT位置,对象o){
        查看查看=(查看)O;
        ((ViewPager)集合).removeView(视图);
        鉴于= NULL;
    }

    @覆盖
    公共布尔isViewFromObject(查看为arg0,对象ARG1){
        返回将arg0 ==((查看)ARG1);
    }
    @覆盖
    公共Parcelable saveState和(){
        返回null;
    }
}
 

我的主要布局文件

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
机器人:方向=垂直
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT>
< android.support.v4.view.ViewPager
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:ID =@ + ID / mysixpanelpager/>
< / LinearLayout中>
 

我保证我会成为一个有用的成员从现在开始(甚至更多所以一旦我真的知道我在做什么)。

编辑: - 在第一个活动,我展示的形象是552KB。 - 这是我在这个活动(PanoramaView)正在显示六个图像是309和500KB之间。 - 我已经使用的分配跟踪在Eclipse和所有我能看到的是内存填充但具体数据我不清楚 - 显示7或8个图像(刷卡背部和第四几次后基本)之后的崩溃发生

下面是$ C $下farfarright.xml

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
机器人:方向=垂直
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT>

< ImageView的
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =WRAP_CONTENT
    机器人:ID =@ + ID / ImageView的
    机器人:SRC =@可绘制/ panorama6
    机器人:adjustViewBounds =真
    机器人:contentDescription =@字符串/全景>

< / ImageView的>
< / LinearLayout中>
 

我已经尝试设置戏外页面限额,这并没有帮助。

我发现内存管理上的另一篇文章这链接,我今晚来看看它。

编辑:这里是LogCat中输出

  11-28 21:17:42.551:D / dalvikvm(328):GC_EXTERNAL_ALLOC释放51K,53%免费2558K / 5379K,外部2002K / 2137K,暂停为65μs
11-28 21:17:43.261:D / dalvikvm(328):GC_EXTERNAL_ALLOC释放1K,53%免费2557K / 5379K,外部3297K / 4118K,暂停44ms
11-28 21:17:47.741:W / KeyCharacterMap(328):没有键盘ID 0
11-28 21:17:47.741:W / KeyCharacterMap(328):使用默认的键盘对应:/system/usr/keychars/qwerty.kcm.bin
11-28 21:17:49.141:D / DFSAPP(328):我的按钮的ID前2
11-28 21:17:49.691:D / dalvikvm(328):GC_EXTERNAL_ALLOC释放36K,52%免费2614K / 5379K,外部15576K / 15708K,暂停50毫秒
11-28 21:17:54.571:D / dalvikvm(328):GC_EXTERNAL_ALLOC释放12K,52%免费2616K / 5379K,外部17386K / 17735K,暂停39MS
11-28 21:17:54.661:D / dalvikvm(328):GC_EXTERNAL_ALLOC释放0K,52%免费2616K / 5379K,外部17386K / 17735K,暂停61ms
11-28 21:17:54.711:I / dalvikvm堆(328):钳目标GC堆从25.629MB为24.000MB
11-28 21:17:54.711:D / dalvikvm(328):GC_FOR_MALLOC释放< 1K,52%免费2616K / 5379K,外部18975K / 21023K,暂停42ms
11-28 21:18:03.751:D / dalvikvm(328):GC_EXTERNAL_ALLOC释放6K,52%免费2616K / 5379K,外部18269K / 20317K,暂停46ms
11-28 21:18:03.822:I / dalvikvm堆(328):钳目标GC堆从25.628MB为24.000MB
11-28 21:18:03.852:D / dalvikvm(328):GC_FOR_MALLOC释放< 1K,52%免费2615K / 5379K,外部18975K / 20317K,暂停为32ms
11-28 21:18:04.131:D / dalvikvm(328):GC_EXTERNAL_ALLOC释放< 1K,52%免费2615K / 5379K,外部17386K / 19434K,暂停49ms
11-28 21:18:04.191:I / dalvikvm堆(328):钳目标GC堆从25.628MB为24.000MB
11-28 21:18:04.201:D / dalvikvm(328):GC_FOR_MALLOC释放0K,52%免费2615K / 5379K,外部18975K / 19434K,暂停34ms
11-28 21:18:07.301:D / dalvikvm(328):GC_EXTERNAL_ALLOC释放1K,52%免费2616K / 5379K,外部18269K / 19434K,暂停46ms
11-28 21:18:07.381:I / dalvikvm堆(328):钳目标GC堆从25.801MB为24.000MB
11-28 21:18:07.401:D / dalvikvm(328):GC_FOR_MALLOC释放< 1K,52%免费2616K / 5379K,外部19152K / 19434K,暂停38ms
11-28 21:18:07.611:D / dalvikvm(328):GC_EXTERNAL_ALLOC释放< 1K,52%免费2615K / 5379K,外部18159K / 19434K,暂停47ms
11-28 21:18:07.681:I / dalvikvm堆(328):钳目标GC堆从25.801MB为24.000MB
11-28 21:18:07.681:D / dalvikvm(328):GC_FOR_MALLOC释放0K,52%免费2615K / 5379K,外部19152K / 19434K,暂停36ms
11-28 21:18:18.901:D / dalvikvm(328):GC_EXTERNAL_ALLOC释放5K,52%免费2616K / 5379K,外部18269K / 19434K,暂停57ms
11-28 21:18:18.972:I / dalvikvm堆(328):钳目标GC堆从25.802MB为24.000MB
11-28 21:18:18.991:D / dalvikvm(328):GC_FOR_MALLOC释放< 1K,52%免费2616K / 5379K,外部19152K / 19434K,暂停为33ms
11-28 21:18:19.181:D / dalvikvm(328):GC_EXTERNAL_ALLOC释放1K,52%免费2615K / 5379K,外部18159K / 19434K,暂停的55ms
11-28 21:18:19.251:I / dalvikvm堆(328):钳目标GC堆从25.801MB为24.000MB
11-28 21:18:19.251:D / dalvikvm(328):GC_FOR_MALLOC释放0K,52%免费2615K / 5379K,外部19152K / 19434K,暂停为33ms
11-28 21:18:21.551:D / dalvikvm(328):GC_EXTERNAL_ALLOC释放1K,52%免费2616K / 5379K,外部18975K / 19434K,暂停46ms
11-28 21:18:21.581:E / dalvikvm堆(328):1627200字节外部分配太大,此过程。
11-28 21:18:21.621:I / dalvikvm堆(328):钳目标GC堆从25.629MB为24.000MB
11-28 21:18:21.621:E / GraphicsJNI(328):虚拟机不会让我们分配1627200字节
11-28 21:18:21.631:D / dalvikvm(328):GC_FOR_MALLOC释放0K,52%免费2616K / 5379K,外部18975K / 19434K,暂停34ms
11-28 21:18:21.641:D / AndroidRuntime(328):关闭虚拟机
11-28 21:18:21.641:W / dalvikvm(328):主题ID = 1:螺纹退出与未捕获的异常(组= 0x40015560)
11-28 21:18:21.732:E / AndroidRuntime(328):致命异常:主要
11-28 21:18:21.732:E / AndroidRuntime(328):android.view.InflateException:二进制XML文件中的行#7:错误充气类<未知>
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.LayoutInflater.createView(LayoutInflater.java:518)
11-28 21:18:21.732:E / AndroidRuntime(328):在com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.LayoutInflater.inflate(LayoutInflater.java:408)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.LayoutInflater.inflate(LayoutInflater.java:320)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.LayoutInflater.inflate(LayoutInflater.java:276)
11-28 21:18:21.732:E / AndroidRuntime(328):在com.businesbike.dfp.MyPagerAdapter.instantiateItem(MyPagerAdapter.java:43)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.support.v4.view.ViewPager.addNewItem(ViewPager.java:692)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.support.v4.view.ViewPager.populate(ViewPager.java:849)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.support.v4.view.ViewPager.populate(ViewPager.java:772)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.support.v4.view.ViewPager.completeScroll(ViewPager.java:1539)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1422)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.ViewGroup.drawChild(ViewGroup.java:1562)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.ViewGroup.drawChild(ViewGroup.java:1644)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.View.draw(View.java:6883)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.widget.FrameLayout.draw(FrameLayout.java:357)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.ViewGroup.drawChild(ViewGroup.java:1646)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.ViewGroup.drawChild(ViewGroup.java:1644)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.View.draw(View.java:6883)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.widget.FrameLayout.draw(FrameLayout.java:357)
11-28 21:18:21.732:E / AndroidRuntime(328):在com.android.internal.policy.impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:1862)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.ViewRoot.draw(ViewRoot.java:1522)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.os.Handler.dispatchMessage(Handler.java:99)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.os.Looper.loop(Looper.java:123)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.app.ActivityThread.main(ActivityThread.java:3683)
11-28 21:18:21.732:E / AndroidRuntime(328):在java.lang.reflect.Method.invokeNative(本机方法)
11-28 21:18:21.732:E / AndroidRuntime(328):在java.lang.reflect.Method.invoke(Method.java:507)
11-28 21:18:21.732:E / AndroidRuntime(328):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
11-28 21:18:21.732:E / AndroidRuntime(328):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-28 21:18:21.732:E / AndroidRuntime(328):在dalvik.system.NativeStart.main(本机方法)
11-28 21:18:21.732:E / AndroidRuntime(328):由:java.lang.reflect.InvocationTargetException
11-28 21:18:21.732:E / AndroidRuntime(328):在java.lang.reflect.Constructor.constructNative(本机方法)
11-28 21:18:21.732:E / AndroidRuntime(328):在java.lang.reflect.Constructor.newInstance(Constructor.java:415)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.view.LayoutInflater.createView(LayoutInflater.java:505)
11-28 21:18:21.732:E / AndroidRuntime(328):36 ...更多
11-28 21:18:21.732:E / AndroidRuntime(328):java.lang.OutOfMemoryError:产生的原因位图的大小超过VM预算
11-28 21:18:21.732:E / AndroidRuntime(328):在android.graphics.Bitmap.nativeCreate(本机方法)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.graphics.Bitmap.createBitmap(Bitmap.java:477)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.graphics.Bitmap.createBitmap(Bitmap.java:444)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.graphics.BitmapFactory.finishDe code(BitmapFactory.java:498)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.graphics.BitmapFactory.de codeStream(BitmapFactory.java:473)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.graphics.BitmapFactory.de codeResourceStream(BitmapFactory.java:336)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.content.res.Resources.loadDrawable(Resources.java:1709)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.content.res.TypedArray.getDrawable(TypedArray.java:601)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.widget.ImageView< INIT>(ImageView.java:118)
11-28 21:18:21.732:E / AndroidRuntime(328):在android.widget.ImageView< INIT>(ImageView.java:108)
11-28 21:18:21.732:E / AndroidRuntime(328):39 ...更多
 

在万一有人遇到这个帖子,这里是什么似乎有固定的: 我从下面的答案改变​​code到code,我也砍了我的全景照片分成更小的位,这样每个图像现在是低于300KB。

解决方案

所以,使用

1

  @覆盖
公共对象instantiateItem(ViewGroup中收集,诠释的位置)
@覆盖
公共无效destroyItem(ViewGroup中收集,INT位置,对象视图)
 

而不是

 公共对象instantiateItem(查看收集,INT位置)
 公共无效destroyItem(查看收集,INT位置,对象视图)
 

2测试在6图像大小400K每个做工精细

  @覆盖
公共对象instantiateItem(ViewGroup中收集,诠释的位置)
{
    LayoutInflater充气=(LayoutInflater)collection.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);



    INT渣油= 0;
    开关(位置){
    情况下0:
        渣油= R.layout.farleft;
        打破;
    情况1:
        渣油= R.layout.left;
        打破;
    案例2:
        渣油= R.layout.middle;
        打破;
    案例3:
        渣油= R.layout.right;
        打破;
    壳体4:
        渣油= R.layout.farright;
        打破;
    壳体5:
        渣油= R.layout.farfarright;
        打破;
    }

查看查看=(查看)inflater.inflate(渣油,NULL);


 //从布局图像视图
// ImageView的ImageView的=(ImageView的)view.findViewById(渣油);

//imageView.setImageResource(resId);

    collection.addView(视图,0);

    返回查看;
}

@覆盖
公共无效destroyItem(ViewGroup中收集,INT位置,对象视图)
{
    collection.removeView((视图));
}
 

3有用的链接 PageAdapter

古德勒克?

I am writing an app that displays a panorama picture that eventually has several markers on it to display information about certain points.

As the large image crashed the app (I have also another activity in the app that is displaying a large map), I am now trying to display the panorama as a sequence of pages with ViewPager.

I have managed to display the picture in 6 bits and I thought things were going well, but now the app crashes after a few swipes (about 7 to 8) as the memory runs out.

I am pulling my hair out as to why that is as I thought my items would get destroyed once they are off the screen?? I am an absolute noobs and I'm so sorry if I'm being a time waster. I have spent all day reading and trying out solutions from here and elsewhere and I am none the wiser.

here is my code: activity PanoramaView

public class PanoramaView extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.panorama);
    MyPagerAdapter adapter = new MyPagerAdapter();
    ViewPager myPager = (ViewPager) findViewById(R.id.mysixpanelpager);
    myPager.setAdapter(adapter);
    myPager.setCurrentItem(2);
}


}

MyPagerAdapter

public class MyPagerAdapter extends PagerAdapter {
    public int getCount() {
        return 6;
    }
    public Object instantiateItem(View collection, int position) {
        LayoutInflater inflater = (LayoutInflater) collection.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        int resId = 0;
        switch (position) {
        case 0:
            resId = R.layout.farleft;
            break;
        case 1:
            resId = R.layout.left;
            break;
        case 2:
            resId = R.layout.middle;
            break;
        case 3:
            resId = R.layout.right;
            break;
        case 4:
            resId = R.layout.farright;
            break;
        case 5:
            resId = R.layout.farfarright;
            break;
        }
        //ImageView imageView = new ImageView(getApplicationContext());
        //imageView.findViewById(R.id.imageView);
        //imageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), ids[position]));

        View view = inflater.inflate(resId, null);
        ((ViewPager) collection).addView(view, 0);
        return view;
    }
    @Override
    public void destroyItem(View collection, int position, Object o) {
        View view = (View)o;
        ((ViewPager) collection).removeView(view);
        view = null;
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == ((View) arg1);
    }
    @Override
    public Parcelable saveState() {
        return null;
    }
}

My main layout file

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mysixpanelpager"/>
</LinearLayout>

I promise I will be a helpful member from now on (or even more so once I actually know what I'm doing).

EDIT: - In the first activity, I'm displaying an image that is 552kb. - The six images that I'm displaying in this activity (PanoramaView) are between 309 and 500kb. - I have used an allocation tracker in Eclipse and all I could see was the memory filling up but the exact data wasn't clear to me - the crash happens after displaying 7 or 8 images (basically after swiping back and fourth several times)

Here is the code for farfarright.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<ImageView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView"
    android:src="@drawable/panorama6"
    android:adjustViewBounds="true"
    android:contentDescription="@string/panorama" >

</ImageView>
</LinearLayout>

I have tried setting the off screen page limit which didn't help.

I found this link about memory management on another post and I'll have a look at it tonight.

EDIT: here is the LogCat output

11-28 21:17:42.551: D/dalvikvm(328): GC_EXTERNAL_ALLOC freed 51K, 53% free 2558K/5379K, external 2002K/2137K, paused 65ms
11-28 21:17:43.261: D/dalvikvm(328): GC_EXTERNAL_ALLOC freed 1K, 53% free 2557K/5379K, external 3297K/4118K, paused 44ms
11-28 21:17:47.741: W/KeyCharacterMap(328): No keyboard for id 0
11-28 21:17:47.741: W/KeyCharacterMap(328): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
11-28 21:17:49.141: D/DFSAPP(328): my button id before is 2
11-28 21:17:49.691: D/dalvikvm(328): GC_EXTERNAL_ALLOC freed 36K, 52% free 2614K/5379K, external 15576K/15708K, paused 50ms
11-28 21:17:54.571: D/dalvikvm(328): GC_EXTERNAL_ALLOC freed 12K, 52% free 2616K/5379K, external 17386K/17735K, paused 39ms
11-28 21:17:54.661: D/dalvikvm(328): GC_EXTERNAL_ALLOC freed 0K, 52% free 2616K/5379K, external 17386K/17735K, paused 61ms
11-28 21:17:54.711: I/dalvikvm-heap(328): Clamp target GC heap from 25.629MB to 24.000MB
11-28 21:17:54.711: D/dalvikvm(328): GC_FOR_MALLOC freed <1K, 52% free 2616K/5379K, external 18975K/21023K, paused 42ms
11-28 21:18:03.751: D/dalvikvm(328): GC_EXTERNAL_ALLOC freed 6K, 52% free 2616K/5379K, external 18269K/20317K, paused 46ms
11-28 21:18:03.822: I/dalvikvm-heap(328): Clamp target GC heap from 25.628MB to 24.000MB
11-28 21:18:03.852: D/dalvikvm(328): GC_FOR_MALLOC freed <1K, 52% free 2615K/5379K, external 18975K/20317K, paused 32ms
11-28 21:18:04.131: D/dalvikvm(328): GC_EXTERNAL_ALLOC freed <1K, 52% free 2615K/5379K, external 17386K/19434K, paused 49ms
11-28 21:18:04.191: I/dalvikvm-heap(328): Clamp target GC heap from 25.628MB to 24.000MB
11-28 21:18:04.201: D/dalvikvm(328): GC_FOR_MALLOC freed 0K, 52% free 2615K/5379K, external 18975K/19434K, paused 34ms
11-28 21:18:07.301: D/dalvikvm(328): GC_EXTERNAL_ALLOC freed 1K, 52% free 2616K/5379K, external 18269K/19434K, paused 46ms
11-28 21:18:07.381: I/dalvikvm-heap(328): Clamp target GC heap from 25.801MB to 24.000MB
11-28 21:18:07.401: D/dalvikvm(328): GC_FOR_MALLOC freed <1K, 52% free 2616K/5379K, external 19152K/19434K, paused 38ms
11-28 21:18:07.611: D/dalvikvm(328): GC_EXTERNAL_ALLOC freed <1K, 52% free 2615K/5379K, external 18159K/19434K, paused 47ms
11-28 21:18:07.681: I/dalvikvm-heap(328): Clamp target GC heap from 25.801MB to 24.000MB
11-28 21:18:07.681: D/dalvikvm(328): GC_FOR_MALLOC freed 0K, 52% free 2615K/5379K, external 19152K/19434K, paused 36ms
11-28 21:18:18.901: D/dalvikvm(328): GC_EXTERNAL_ALLOC freed 5K, 52% free 2616K/5379K, external 18269K/19434K, paused 57ms
11-28 21:18:18.972: I/dalvikvm-heap(328): Clamp target GC heap from 25.802MB to 24.000MB
11-28 21:18:18.991: D/dalvikvm(328): GC_FOR_MALLOC freed <1K, 52% free 2616K/5379K, external 19152K/19434K, paused 33ms
11-28 21:18:19.181: D/dalvikvm(328): GC_EXTERNAL_ALLOC freed 1K, 52% free 2615K/5379K, external 18159K/19434K, paused 55ms
11-28 21:18:19.251: I/dalvikvm-heap(328): Clamp target GC heap from 25.801MB to 24.000MB
11-28 21:18:19.251: D/dalvikvm(328): GC_FOR_MALLOC freed 0K, 52% free 2615K/5379K, external 19152K/19434K, paused 33ms
11-28 21:18:21.551: D/dalvikvm(328): GC_EXTERNAL_ALLOC freed 1K, 52% free 2616K/5379K, external 18975K/19434K, paused 46ms
11-28 21:18:21.581: E/dalvikvm-heap(328): 1627200-byte external allocation too large for this process.
11-28 21:18:21.621: I/dalvikvm-heap(328): Clamp target GC heap from 25.629MB to 24.000MB
11-28 21:18:21.621: E/GraphicsJNI(328): VM won't let us allocate 1627200 bytes
11-28 21:18:21.631: D/dalvikvm(328): GC_FOR_MALLOC freed 0K, 52% free 2616K/5379K, external 18975K/19434K, paused 34ms
11-28 21:18:21.641: D/AndroidRuntime(328): Shutting down VM
11-28 21:18:21.641: W/dalvikvm(328): threadid=1: thread exiting with uncaught exception (group=0x40015560)
11-28 21:18:21.732: E/AndroidRuntime(328): FATAL EXCEPTION: main
11-28 21:18:21.732: E/AndroidRuntime(328): android.view.InflateException: Binary XML file line #7: Error inflating class <unknown>
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.LayoutInflater.createView(LayoutInflater.java:518)
11-28 21:18:21.732: E/AndroidRuntime(328):  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
11-28 21:18:21.732: E/AndroidRuntime(328):  at com.businesbike.dfp.MyPagerAdapter.instantiateItem(MyPagerAdapter.java:43)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:692)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.support.v4.view.ViewPager.populate(ViewPager.java:849)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.support.v4.view.ViewPager.populate(ViewPager.java:772)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:1539)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1422)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.ViewGroup.drawChild(ViewGroup.java:1562)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.View.draw(View.java:6883)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.widget.FrameLayout.draw(FrameLayout.java:357)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.View.draw(View.java:6883)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.widget.FrameLayout.draw(FrameLayout.java:357)
11-28 21:18:21.732: E/AndroidRuntime(328):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.ViewRoot.draw(ViewRoot.java:1522)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.os.Looper.loop(Looper.java:123)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.app.ActivityThread.main(ActivityThread.java:3683)
11-28 21:18:21.732: E/AndroidRuntime(328):  at java.lang.reflect.Method.invokeNative(Native Method)
11-28 21:18:21.732: E/AndroidRuntime(328):  at java.lang.reflect.Method.invoke(Method.java:507)
11-28 21:18:21.732: E/AndroidRuntime(328):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-28 21:18:21.732: E/AndroidRuntime(328):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-28 21:18:21.732: E/AndroidRuntime(328):  at dalvik.system.NativeStart.main(Native Method)
11-28 21:18:21.732: E/AndroidRuntime(328): Caused by: java.lang.reflect.InvocationTargetException
11-28 21:18:21.732: E/AndroidRuntime(328):  at java.lang.reflect.Constructor.constructNative(Native Method)
11-28 21:18:21.732: E/AndroidRuntime(328):  at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.view.LayoutInflater.createView(LayoutInflater.java:505)
11-28 21:18:21.732: E/AndroidRuntime(328):  ... 36 more
11-28 21:18:21.732: E/AndroidRuntime(328): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.graphics.Bitmap.nativeCreate(Native Method)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.content.res.Resources.loadDrawable(Resources.java:1709)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.widget.ImageView.<init>(ImageView.java:118)
11-28 21:18:21.732: E/AndroidRuntime(328):  at android.widget.ImageView.<init>(ImageView.java:108)
11-28 21:18:21.732: E/AndroidRuntime(328):  ... 39 more

In case someone comes across this post, here is what seems to have fixed it: I have change the code to the code from the answer below and I have also cut up my panorama picture into smaller bits so each image is now below 300kb.

解决方案

So use

1

@Override
public Object instantiateItem(ViewGroup collection, int position)
@Override
public void destroyItem(ViewGroup collection, int position, Object view)

instead of

 public Object instantiateItem(View collection, int position)
 public void destroyItem(View collection, int position, Object view)

2 Tested on 6 images size 400k each work fine

@Override
public Object instantiateItem(ViewGroup collection, int position)
{
    LayoutInflater inflater = (LayoutInflater) collection.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);



    int resId = 0;
    switch (position) {
    case 0:
        resId = R.layout.farleft;
        break;
    case 1:
        resId = R.layout.left;
        break;
    case 2:
        resId = R.layout.middle;
        break;
    case 3:
        resId = R.layout.right;
        break;
    case 4:
        resId = R.layout.farright;
        break;
    case 5:
        resId = R.layout.farfarright;
        break;
    }

View view = (View) inflater.inflate(resId, null);


 //get Image view from layout   
//ImageView imageView = (ImageView) view.findViewById(resId);

//imageView.setImageResource(resId);

    collection.addView(view, 0);

    return view;
}

@Override
public void destroyItem(ViewGroup collection, int position, Object view)
{
    collection.removeView((View) view);
}

3 Useful link PageAdapter

Goodluck

这篇关于Android的ViewPager与图像:内存泄漏/应用程序崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆