我正在使用BitmapFactory
从文件解码JPG,然后使用imageBitmap
设置ImageView
。有时,该应用程序崩溃为“java.lang.OutOfMemoryError: bitmap size exceeds VM budget
”
我尝试过使用:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bm = BitmapFactory.decodeFile(filepath, options);
它似乎工作了一段时间,但现在不再了。我该怎么办?
答案 0 :(得分:1)
在Android中,可以为应用程序分配多少内存,可能是大约16 MB到32 MB。 (Upto Android版)
对于2百万像素,位图所需的内存为2 * 4 = 8 M.
要减少内存消耗,您需要降低图像分辨率。说WVGA,800x480以
开头词shash
答案 1 :(得分:0)
减少使用的图像数量或缓存它们,如果缓存它们,请将它们存储在您需要的最小尺寸中。
此致 斯特凡
答案 2 :(得分:0)
这是缓存图像文件的代码。
protected static Map<String, Drawable> cacheThumbs = new HashMap<String, Drawable>();
//缓存图片的代码
if( thumbUri.length() == 0 )
return;
Drawable d = cacheThumbs.get( thumbUri );
if( d == null )
{
String fileName = movie.getId()+"_"+thumbUri.substring( thumbUri.lastIndexOf('/')+1 );
cacheFile = new File( application.getCacheDir(), fileName );
if( !cacheFile.exists() )
{
//Log.v(LOG_TAG,"Fetching "+thumbUri +" and caching in "+cacheFile.getAbsolutePath() );
InputStream bis = (InputStream) new URL(thumbUri).getContent();
BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream( cacheFile ) );
int read = 0;
while( (read = bis.read( buffer )) != -1 )
bos.write( buffer, 0, read );
bis.close();
bos.close();
Log.v(LOG_TAG,thumbUri + " fetched");
}//if
Log.v(LOG_TAG,thumbUri + " in cache");
BufferedInputStream bis = new BufferedInputStream( new FileInputStream( cacheFile ), 9000 );
d = Drawable.createFromStream( bis, "src name");
bis.close();
cacheThumbs.put( thumbUri, d );
此致 斯特凡
答案 3 :(得分:0)
我想为此讨论添加不同的观点。我确实阅读了很多线程和建议,最后用WebView显示单个图像。对于单个图像而言,它不适用于画廊。它的工作完美,可以通过选项进行缩放,可滚动,最后没有内存错误; - )
适用于从网络加载的图像以及本地图像。这是一个小例子:
WebView webView = (WebView) findViewById(R.id.your_webview);
String html = "<html><head><title>A title</title></head><body bgcolor=\"#000000\"><img src=\"" + url + "\"></body></html>";
WebSettings webSettings = webView.getSettings();
webSettings.setBuiltInZoomControls(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setSupportZoom(true);
webSettings.setUseWideViewPort(true);
webView.setScrollbarFadingEnabled(true);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.loadDataWithBaseURL("fake://fake.com", html, "text/html", "UTF-8", null);