使用setImageUri的OutOfMemory

时间:2013-11-25 22:40:14

标签: android memory android-fragments uri out-of-memory

我有一个带有大量片段的ViewPagerActivity(滑动视图)。每个片段都包含一个imageView。有时,当我在这些片段之间导航时,我有一个错误:

11-25 23:22:05.880: E/AndroidRuntime(15019): FATAL EXCEPTION: main
11-25 23:22:05.880: E/AndroidRuntime(15019): java.lang.OutOfMemoryError
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:650)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:476)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at    android.graphics.drawable.Drawable.createFromStream(Drawable.java:741)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.widget.ImageView.resolveUri(ImageView.java:631)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.widget.ImageView.setImageURI(ImageView.java:379)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at com.thesnowcoach.android.jpgviewer.JpgFragment.loadNewCourse(JpgFragment.java:381)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at com.thesnowcoach.android.jpgviewer.JpgFragment.onCreateView(JpgFragment.java:199)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
11-25 23:22:05.880: E/AndroidRuntime(15019):    at android.support.v4.view.ViewPager$3.run(ViewPager.java:244)

代码:

private void loadNewCourse(int times) {

        Display display = this.getActivity().getWindowManager().getDefaultDisplay();

        int height = display.getHeight();

        mImageSwitcher.getLayoutParams().height=height;

        barLayout.setBackgroundColor(Color.rgb(cours.getCategorie()
                .getCouleur().getR(), cours.getCategorie().getCouleur().getV(),
                cours.getCategorie().getCouleur().getB()));
        // Ajout du titre de la progression à la fenetre
        titreCours = (TextView) barLayout.findViewById(R.id.titreCours);
        titreCours.setText(cours.getTitre());
        mImages = JpgViewerTools.loadPicturesFromSDCardExcept(absolutePath + File.separator
                + cours.getId());

        slidesSize = mImages.size();

        mDifferentSlidesSize = ViewPagerActivity.slidesSize;
        displaySlidesCount();
        if (times == 0) {
            barState = BarState.ELLAPSED;
        } else
            barState = BarState.ELLAPSED;
        mImageSwitcher.setImageURI(Uri.fromFile(new File(mImages
                .get(getArguments().getInt("position")))));

        state = setState(getArguments().getInt("position"));
    }

我该如何解决这个问题? 感谢

1 个答案:

答案 0 :(得分:0)

使用寻呼机时,所有图像都保存在内存中。如果您快速切换页面可能会出现一个问题。要解决此问题,请在读取滑动之间添加一点延迟。其次,如果文件很大,那么随着堆栈的累积,你会随着时间的推移收到这个错误。考虑减少图像大小或在一定数量后删除页面,并在以后需要时添加它们。最后,如果您使用模拟器测试您的设备,您可能只需要增加模拟器的内存。