【问题标题】:Android: Bitmap in ImageSwitcher causes OutOfMemory-ErrorAndroid:ImageSwitcher 中的位图导致 OutOfMemory-Error
【发布时间】:2013-08-25 14:42:14
【问题描述】:

我需要你的帮助。我尝试了很多不同的方法来找出问题所在,但我仍然有内存问题。 这是我的代码:

public class AboutActivity extends Activity implements ViewSwitcher.ViewFactory {
//private WebView webview;
static final String BRANDING_PREFS_NAME = "BrandingInfo";

int[] imageIds = {0,1,2,3,4,5 };
int currentImageIndex = 0;
//Runnables
private final Handler handler = new Handler();
private ShowNextImageRunnable showNextImage;
/** Called when the activity is first created. */
/**@Override */
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.about);

    ImageSwitcher imageSwitcher =    (ImageSwitcher)findViewById(R.id.imageSwitcher);
    imageSwitcher.setFactory(this);
    imageSwitcher.setImageResource(R.drawable.about);
    if(brandingInfo.getString("aboutImage0", "").length() > 0 ||
       brandingInfo.getString("aboutImage1", "").length() > 0 ||
       brandingInfo.getString("aboutImage2", "").length() > 0 ||
       brandingInfo.getString("aboutImage3", "").length() > 0 ||
       brandingInfo.getString("aboutImage4", "").length() > 0 ||
       brandingInfo.getString("aboutImage5", "").length() > 0) {
        handler.postDelayed(showNextImage, 0);
    }
}

@Override
public void onPause() {
    super.onPause();
}

@Override
public void onResume() {
    super.onResume();
}

public View makeView() {
      ImageView i = new ImageView(this);
      i.setBackgroundColor(0xFF000000);
      i.setScaleType(ImageView.ScaleType.FIT_START);
      i.setLayoutParams(new ImageSwitcher.LayoutParams(ImageSwitcher.LayoutParams.MATCH_PARENT,
              ImageSwitcher.LayoutParams.MATCH_PARENT));
      i.setAdjustViewBounds(true);
      return i; 
}

private boolean showNextImage(int index){
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPurgeable = true;
    options.inInputShareable = true;
    Bitmap bitmap = null;
    try {
        bitmap = BitmapFactory.decodeStream(openFileInput("about"+index+".png"), null, options);
    } catch (FileNotFoundException e) {
        return false;
    }
    ImageSwitcher imageSwitcher = (ImageSwitcher)findViewById(R.id.imageSwitcher);
    final ImageView g = (ImageView) imageSwitcher.getCurrentView();
    final Bitmap b = bitmap;
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (b != null) {
                g.setImageBitmap(b);
            }
        }
    });
    bitmap = null;
    return true;
}

class ShowNextImageRunnable implements Runnable {

      public void run() {
        ++currentImageIndex;
        if(currentImageIndex >= imageIds.length)
            currentImageIndex = 0;

        if(!showNextImage(currentImageIndex))
            handler.postDelayed(showNextImage, 0);
        else
            handler.postDelayed(showNextImage, 3000);
      }

  }

}

Eclipse 内存分析器向我显示,内存以 byte[] 的形式累积,大小为 1,3 MB。位图的大小是问题吗?我不知道为什么内存会增长。

BitmapFactory类的“decodeStream()”函数出现错误。

希望你能帮助我。

编辑: 每个位图的大小约为 1,3 MB,也许它太大了。如何为我的图像切换器实现位图缓存。我有 6 张图片,每 3 秒加载一张图片。我想过一个“公共静态LRU-CACHE”?

【问题讨论】:

  • 它的整个应用程序占用了太多内存。可能是由于加载了太多尺寸过大的位图。位图有多大?而且您可能希望实现缓存,这样您就不会保留旧位图和/或显式回收旧位图。
  • 您好,图片大小约为 1.3MB。有这么大吗?你能给我一个提示如何实现缓存吗?谢谢
  • 其中 1 个不是,其中许多可以。对于缓存,请查看 LRUCache,它在支持库中。

标签: android bitmap out-of-memory bitmapfactory imageswitcher


【解决方案1】:

根据您正在测试的 Android 版本,您可能会遇到与位图相关的问题。实际的像素数据不会被垃圾回收,因此您必须在未使用的 Bitmap 对象上显式调用回收方法(这已在以后的 Android 版本中修复)。

下一个问题是您的解码方法应该将位图缩小到所需的大小。你的图片可能太大了。

【讨论】:

  • 该问题仅出现在 Android 4.2.2 上。我ve tried it with recycle, but didnt 帮忙。是图片的大小吗?
  • @WilhelmDewald 不管怎样,你绝对应该缩小位图。应用程序进程的 (Java) 堆大小非常有限,例如加载 8MP 照片只是为了在 400x400 视图中显示它既浪费又慢。您应该阅读以下文章:developer.android.com/training/displaying-bitmaps/index.html
  • 好的。也许这绝对是一种选择。我会看看这个选项。谢谢诺布
  • 嗨 Nobu 游戏。缩放位图并实现 LRUCache 解决了这个问题。谢谢
猜你喜欢
  • 2015-11-14
  • 2019-02-15
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2016-02-12
相关资源
最近更新 更多