首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android: ImageSwitcher中的位图导致输出记忆错误

Android: ImageSwitcher中的位图导致输出记忆错误
EN

Stack Overflow用户
提问于 2013-08-22 18:02:34
回答 1查看 671关注 0票数 1

我需要你的帮助。为了找出这个问题,我尝试了很多不同的方法,但是我仍然有一个记忆问题。这是我的密码:

代码语言:javascript
复制
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,3MB的速度积累的。位图的大小是问题所在吗?我不知道为什么记忆会增加。

错误发生在BitmapFactory类的“BitmapFactory()”函数上。

希望你能帮我。

编辑:每个位图的大小是~ 1,3 MB,可能是太大了。如何为图像转换程序实现位图缓存。我有6个图像,每3秒加载一个图像。我想过一个“公共静态LRU缓存”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-22 18:11:54

根据您正在测试的Android版本,您可能会遇到与Bitmap相关的问题。实际的像素数据不会被垃圾收集,所以您必须显式地调用一个未使用的Bitmap对象上的循环方法(这在以后的Android版本中已经得到了修正)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18387711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档