2013-08-22 29 views
1

我需要你的帮助。我尝试了很多不同的东西来找出问题,但我仍然有一个记忆问题。 Here`s我的代码:Android:ImageSwitcher中的位图会导致OutOfMemory错误

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的内存分析器向我表明,记忆积累在字节[]与1,3 MB。位图的大小是否是问题?我不知道为什么内存会增长。

该错误发生在BitmapFactory类的“decodeStream()”函数中。

希望你能帮助我。

编辑: 每个位图的大小是〜1,3 MB,也许它很大。我如何实现我的imageswitcher的位图缓存。我有6张图片,每3秒钟加载一张图片。我想过一个“公共静态LRU-CACHE”?

+0

它的总应用程序使用的内存太多。可能是因为加载太多大小的位图。位图有多大?你可能想要实现缓存,所以你不要保留旧的位图和/或显式地回收旧的位图。 –

+0

嗨图像的大小是〜1,3MB。这是大吗?你能给我一个提示如何实现缓存? Thx –

+0

其中1人不是,他们中的很多人都可以。要进行缓存,请查看支持库中的LRUCache。 –

回答

0

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

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

+0

该问题仅在Android 4.2.2上发生。我已经尝试过回收,但没有帮助。这可能是图像的大小? –

+0

@WilhelmDewald无论哪种方式,你绝对应该缩小位图。应用程序进程的(Java)堆大小非常有限,例如,为了在400x400视图中显示它而加载800万像素的照片是浪费和缓慢的。你应该阅读以下文章:http://developer.android.com/training/displaying-bitmaps/index.html – tiguchi

+0

好的。也许这是一个明确的选择。我会看看这个选项。谢谢Nobu –

相关问题