1

嗨,我有一个 ViewPager 问题,我在使用 ViewPager 时在 XHDPI 设备上遇到了 OOM。在 MDPI 和 HDPI 设备上完美运行。

这是我的日志猫:

12-27 17:06:11.082: E/dalvikvm-heap(10480): 3936000-byte external allocation too large for this process.
12-27 17:06:11.082: E/GraphicsJNI(10480): VM won't let us allocate 3936000 bytes
12-27 17:06:11.102: E/AndroidRuntime(10480): FATAL EXCEPTION: main
12-27 17:06:11.102: E/AndroidRuntime(10480): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:483)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:359)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:382)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:408)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at com.phonethics.madhuridixitnene.MainImageFragment.bitmap(MainImageFragment.java:167)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at com.phonethics.madhuridixitnene.MainImageFragment.onCreateView(MainImageFragment.java:125)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.support.v4.view.ViewPager.populate(ViewPager.java:1012)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:523)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:495)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:487)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at com.phonethics.madhuridixitnene.MadhuriHomeScreen$PageListener$5.run(MadhuriHomeScreen.java:666)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.os.Handler.handleCallback(Handler.java:587)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.os.Looper.loop(Looper.java:138)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at android.app.ActivityThread.main(ActivityThread.java:3701)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at java.lang.reflect.Method.invokeNative(Native Method)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at java.lang.reflect.Method.invoke(Method.java:507)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
12-27 17:06:11.102: E/AndroidRuntime(10480):    at dalvik.system.NativeStart.main(Native Method)

我尝试回收位图,但事件不起作用。

我有大约 22 张 1280X800 分辨率的图像,我知道这些图像要多得多。但是当我将它们与寻呼机一起使用时,它会在第 3 次或第 4 次滑动后崩溃。

这是我的片段类:

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageView;

public class MainImageFragment extends Fragment{

    Context context;
    String imgname;
    String animate;
    int tagPosition;
    Bitmap bm;
    public MainImageFragment()
    {

    }
    public MainImageFragment(Context context,String imgname,String animate,int position)
    {
        this.context=context;
        this.imgname=imgname;
        this.animate=animate;
        tagPosition=position;

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        if(savedInstanceState!=null)
        {
            imgname=savedInstanceState.getString("imgName");
            animate=savedInstanceState.getString("animate");
            context=getActivity().getApplicationContext();
        }

        View view=(View)inflater.inflate(R.layout.mainimagelayout,null);
        try
        {
            ImageView imgView=(ImageView)view.findViewById(R.id.mainImage);
            imgView.setTag(tagPosition);

            bm=bitmap(imgname);
            imgView.setImageBitmap(bm);
        //  imgView.setImageDrawable(context.getResources().getDrawable(context.getResources().getIdentifier("drawable/"+imgname, "drawable",context.getPackageName())));
            if(animate.equalsIgnoreCase("1"))
            {
                /*Animation anim=AnimationUtils.loadAnimation(context, R.anim.fade_in);
            anim.setFillAfter(true);
            imgView.startAnimation(anim);*/
                imgView.setVisibility(View.INVISIBLE);
            }

        }catch(Exception ex)
        {
            ex.printStackTrace();
        }



        return view;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
        if(savedInstanceState!=null)
        {
            imgname=savedInstanceState.getString("imgName");
            animate=savedInstanceState.getString("animate");
        }
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
        outState.putString("imgName", imgname);
        outState.putString("animate", animate);
        context=getActivity().getApplicationContext();

    }

    private Bitmap bitmap(String name)
    {
        final Bitmap bitmap=BitmapFactory.decodeResource(getResources(), getResources().getIdentifier(name, "drawable", getActivity().getPackageName()));
        return bitmap;
    }
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        bm.recycle();
        super.onDestroy();
    }




}

这是我的适配器类:

public  class MainAdapter extends FragmentStatePagerAdapter
    {

        Context context;
        ArrayList<String>imgname=null;
        ArrayList<String>animate;
        public MainAdapter(FragmentManager fm,Context context,ArrayList<String>imgname,ArrayList<String>animate) {
            super(fm);
            // TODO Auto-generated constructor stub
            this.context=context;
            this.imgname=imgname;
            this.animate=animate;
        }

        @Override
        public Fragment getItem(int position) {
            // TODO Auto-generated method stub

            return new MainImageFragment(context, imgname.get(position),animate.get(position),position);

        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return imgname.size();
        }


            @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            // TODO Auto-generated method stub
            FragmentManager manager = ((Fragment) object).getFragmentManager();
            FragmentTransaction trans = manager.beginTransaction();
            trans.remove((Fragment) object);
            trans.commit();
            super.destroyItem(container, position, object);
        }


    }
4

0 回答 0