IllegalArgumentException:无法通过recreatign活动绘制回收的位图

时间:2015-01-01 23:44:36

标签: java android bitmap

我有一个带有ImageView的简单片段,用户可以将pic令牌设置为其背景。 但只要那里没有照片。默认的PNG将是ImageView的背景。

有两个XML文件,一个用于纵向,一个用于横向。


portrait_fragment.xml

<?xml version="1.0" encoding="utf-8"?>

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

        <ImageView
            android:layout_width="80dip"
            android:layout_height="80dip"
            android:id="@+id/crime_imageView"
            android:scaleType="centerCrop"
            android:focusableInTouchMode="false"
            android:cropToPadding="true"
            android:adjustViewBounds="true"
            android:src="@drawable/ic_menu_gallery" />

    </LinearLayout>

landscape_fragment.xml与第一个相同。


现在我的片段代码。

imageview_fragment.java

public class CrimeFragment extends Fragment {

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      ...
   }

   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup parent,
                         Bundle savedInstanceState) {
       View v = inflater.inflate(R.layout.fragment_crime, parent, false);
       ...
      ...
   }

   @Override
   public void onStart() {
      super.onStart();
      showPhoto();
   }

   @Override
   public void onStop() {
      super.onStop();
      cleanImageView(mImageView);
   }

   private void showPhoto() {

      // (Re)set the image button's image based on our photo
      Photo photo = mCrime.getPhoto();

      // get the default background of imageview 
      BitmapDrawable bitmapDrawable =
            (BitmapDrawable) getResources().getDrawable(R.drawable.ic_menu_gallery);

      // if we got any user related pic set it as imageviewsbackground
      if (photo != null) {
          String path =         
              getActivity().getFileStreamPath(photo.getFilename()).getAbsolutePath();
          bitmapDrawable = PictureUtils.getScaledDrawable(getActivity(), path);
      }

      mImageView.setImageDrawable(bitmapDrawable);
 }

public void cleanImageView(ImageView imageView) {
    if (!(imageView.getDrawable() instanceof BitmapDrawable))
        return;

    // clean up the view's image for the sake of memory
    BitmapDrawable bitmapDrawable = (BitmapDrawable) imageView.getDrawable();
    bitmapDrawable.getBitmap().recycle();
    imageView.setImageDrawable(null);
 }

现在问题出现在我每次都得到这个问题之后 exceprion

IllegalArgumentException: Cannot draw recycled bitmaps

我知道只要没有,就没有必要回收位图 参考。

但我想了解这里的错误。正如我从这里的不同问题和调用回收并将位图设置为null后的android文档所理解的 正如我在&#34; cleanImageView &#34;一切都应该没问题!所以重新创建活动&#34; onStart &#34;将被调用并且在&#34; showPhoto &#34;一个新的参考 将创建PNG资源并将其传递给imageview !!!!

我在这里做错了什么???

thx

1 个答案:

答案 0 :(得分:1)

最后我找到了解决问题的方法..

    // get the default background of imageview 
    BitmapDrawable bitmapDrawable =
        (BitmapDrawable) getResources().getDrawable(R.drawable.ic_menu_gallery);

拒绝加载相同的图像两次。 你必须强迫它这样做:

BitmapDrawable bitmapDrawable =
            new BitmapDrawable(getResources(), BitmapFactory.decodeResource(getResources(), R.drawable.ic_menu_gallery));

知道加载的位图每次都有不同的地址...... 我知道每次加载相同的图像并不好。 但在这里我只是想了解导致非法感染的原因