在第二次创建位图后,我收到以下错误:
04-17 18:28:09.310: ERROR/AndroidRuntime(3458): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
this._profileBitmap = Bitmap.createBitmap(_profileBitmap, xCoor, yCoor, width, height);
Run Code Online (Sandbox Code Playgroud)
从日志:
04-17 18:27:57.500: INFO/CameraCropView(3458): Original Photo Size: W 1536 x H 2048
04-17 18:28:06.170: INFO/CameraCropView(3458): xCoor: 291
04-17 18:28:06.170: INFO/CameraCropView(3458): yCoor: 430
04-17 18:28:06.170: INFO/CameraCropView(3458): Width: 952
04-17 18:28:06.170: INFO/CameraCropView(3458): Height: 952
Run Code Online (Sandbox Code Playgroud)
由于图像很大,我得到了错误.但有趣的是错误不是第一次发生,只有当我第二次拍摄时才会发生,这让我相信这个profileBitmap不会被破坏.我该如何清理它?
创建一个具有大量高质量图像的应用程序,我决定将图像缩小到所需的大小(这意味着如果图像大于屏幕,我会缩小它的尺寸).
我注意到在某些设备上,如果图像缩小,它们变得模糊/像素化,但在同一设备上,对于相同的目标imageView大小,如果图像没有缩小尺寸,它们看起来很好.
我已经决定进一步检查这个问题,并创建了一个显示问题的小型POC应用程序.
在向您展示代码之前,这里是我正在谈论的演示:

看到差异有点难,但你可以看到第二个有点像素化.这可以在任何图像上显示.
public class MainActivity extends Activity
{
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView originalImageView=(ImageView)findViewById(R.id.originalImageView);
final ImageView halvedImageView=(ImageView)findViewById(R.id.halvedImageView);
final ImageView halvedBitmapImageView=(ImageView)findViewById(R.id.halvedBitmapImageView);
//
final Bitmap originalBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test);
originalImageView.setImageBitmap(originalBitmap);
halvedImageView.setImageBitmap(originalBitmap);
//
final LayoutParams layoutParams=halvedImageView.getLayoutParams();
layoutParams.width=originalBitmap.getWidth()/2;
layoutParams.height=originalBitmap.getHeight()/2;
halvedImageView.setLayoutParams(layoutParams);
//
final Options options=new Options();
options.inSampleSize=2;
// options.inDither=true; //didn't help
// options.inPreferQualityOverSpeed=true; //didn't help
final Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test,options);
halvedBitmapImageView.setImageBitmap(bitmap);
}
}
Run Code Online (Sandbox Code Playgroud)
XML:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context=".MainActivity"
android:fillViewport="true">
<HorizontalScrollView android:layout_width="match_parent"
android:fillViewport="true" android:layout_height="match_parent">
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent" …Run Code Online (Sandbox Code Playgroud) 我已经阅读了许多关于解码位图的内存分配问题的相关帖子,但即使在使用官方网站提供的代码后仍然无法找到解决以下问题的方法.
这是我的代码:
public static Bitmap decodeSampledBitmapFromResource(InputStream inputStream, int reqWidth, int reqHeight) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
try {
while ((len = inputStream.read(buffer)) > -1) {
baos.write(buffer, 0, len);
}
baos.flush();
InputStream is1 = new ByteArrayInputStream(baos.toByteArray());
InputStream is2 = new ByteArrayInputStream(baos.toByteArray());
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(is1, null, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inPurgeable = true;
options.inInputShareable = true;
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
return BitmapFactory.decodeStream(is2, null, …Run Code Online (Sandbox Code Playgroud) 我开发了一个在Android上使用大量图像的应用程序.
可绘制文件夹中有很多图像说超过100,我正在开发图像动画应用程序.我用imageview来显示GIF图像.我已经将Split gif图像的概念用于多个PNG格式图像,然后使用它.
每次用户进入应用程序时,我都可以看到内存越来越多,直到用户获得java.lang.OutOfMemoryError.
那么处理许多图像的最佳/正确方法是什么?
以下是我的代码:
dog_animation.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/DogView"
android:orientation="vertical" >
<ImageView
android:id="@+id/dog_animation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.19" />
Run Code Online (Sandbox Code Playgroud)
dog_animation.xml(Drawable文件夹)
<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)
<item
android:drawable="@drawable/image"
android:duration="50"/>
<item
android:drawable="@drawable/image1"
android:duration="50"/>
<item
android:drawable="@drawable/image2"
android:duration="50"/>
<item
android:drawable="@drawable/image3"
android:duration="50"/>
<item
android:drawable="@drawable/image4"
android:duration="50"/>
<item
android:drawable="@drawable/image5"
android:duration="50"/>
<item
android:drawable="@drawable/image6"
android:duration="50"/>
<item
android:drawable="@drawable/image7"
android:duration="50"/>
<item
android:drawable="@drawable/image8"
android:duration="50"/>
<item
android:drawable="@drawable/image9"
android:duration="50"/>
<item
android:drawable="@drawable/image10"
android:duration="50"/>
<item
android:drawable="@drawable/image11"
android:duration="50"/>
<item
android:drawable="@drawable/image12"
android:duration="50"/>
<item
android:drawable="@drawable/image13"
android:duration="50"/>
<item
android:drawable="@drawable/image14"
android:duration="50"/>
<item
android:drawable="@drawable/image15"
android:duration="50"/>
<item
android:drawable="@drawable/image16"
android:duration="50"/>
<item
android:drawable="@drawable/image17"
android:duration="50"/> …Run Code Online (Sandbox Code Playgroud) 我想在我的Android应用程序中实现启动页面.所以在布局xml中,有一个imageView,图像文件是一个png文件1080*1920,当运行应用程序时,它会发生OutOfMemoryError错误,我该如何解决?
XML文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/welcome1"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
错误信息:
04-17 18:40:16.038 29793-29793/cn.test.android E/AndroidRuntime? FATAL EXCEPTION: main
Process: cn.test.android, PID: 29793
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:597)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:432)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
at android.content.res.Resources.createFromResourceStream(Resources.java:2477)
at android.content.res.Resources.loadDrawable(Resources.java:2136)
at android.content.res.MiuiResources.loadDrawable(MiuiResources.java:320)
at android.content.res.Resources.getDrawable(Resources.java:710)
at android.widget.ImageView.resolveUri(ImageView.java:638)
at android.widget.ImageView.setImageResource(ImageView.java:367)
at cn.test.android.LandingPageActivity$1.instantiateItem(LandingPageActivity.java:40)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:837)
at android.support.v4.view.ViewPager.populate(ViewPager.java:987)
at android.support.v4.view.ViewPager.populate(ViewPager.java:919)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441)
at android.view.View.measure(View.java:16508)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16508)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at …Run Code Online (Sandbox Code Playgroud) 在Android中,以下最简单的方法是什么:
我在viewpager中显示150多个图像,当页面大小超过70应用程序崩溃,所有图像都从网络加载,我已经休闲[链接]:将图像加载到Bitmap对象时出现奇怪的内存不足问题
当页面滑动达到4时,我正在回收它,
70页应用程序需要200 MB的内存.
我需要你的帮助,如何处理它
我必须用刷卡显示所有页面...
我也使用过Runtime.getRuntime().gc();
如果应用程序内存达到50+ MB,则可以释放内存
提前致谢
我在webview中显示一个相当大的图像,以便可以使用缩放缩放功能和其他查看便利.
它第一次正确显示.但是在离开活动并回到它之后,应用程序崩溃了与webview线程相关的OutofMemoryError.
我尝试了几个尝试关闭webview或停止线程,或清除其内存使用,但无济于事.以下是我添加到活动onStop()功能中的代码示例
wv.stopLoading();
wv.clearCache(true);
//removeView(wv);
wv.clearView();
wv.freeMemory();
wv.destroy();
try {
Class.forName("android.webkit.WebView").getMethod("onPause", (Class[]) null).invoke(wv, (Object[]) null);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO …Run Code Online (Sandbox Code Playgroud) 我正在开发一个具有非常强烈的图像处理的应用程序,其中我ListFragments在水平方向上有多个FragmentStatePagerAdapter.我积极地采用了我能够在这里和其他地方找到的每一个技巧和建议.我下载位图并将它们保存到SD并作为软参考存储器缓存.
然而,当我在某个时刻使用应用程序时,我开始在LogCat中看到消息,就像下面的消息一样
11-05 15:57:43.951: I/dalvikvm-heap(5449): Clamp target GC heap from 32.655MB to 32.000MB
11-05 15:57:43.951: D/dalvikvm(5449): GC_FOR_MALLOC freed 0K, 24% free 11512K/14983K, external 17446K/17896K, paused 64ms
11-05 15:57:44.041: D/dalvikvm(5449): GC_EXTERNAL_ALLOC freed <1K, 24% free 11511K/14983K, external 17258K/17896K, paused 77ms
Run Code Online (Sandbox Code Playgroud)
如果我继续,上面的消息将变得更加紧迫
11-05 16:02:09.590: D/dalvikvm(5449): GC_FOR_MALLOC freed 0K, 23% free 11872K/15239K, external 17497K/17896K, paused 71ms
11-05 16:02:09.700: D/dalvikvm(5449): GC_EXTERNAL_ALLOC freed <1K, 23% free 11872K/15239K, external 17497K/17896K, paused 84ms
11-05 16:02:09.720: E/dalvikvm-heap(5449): 192816-byte external allocation too large for this …Run Code Online (Sandbox Code Playgroud) 我在开发人员控制台中获得了以下堆栈跟踪.一些报告称"应用程序无法启动"或"启动时崩溃".
我不知道该怎么做,它在我的应用程序课上没有提到任何内容!任何人都有同样的错误,并找到了修复?
java.lang.IllegalArgumentException: bitmap size exceeds 32bits
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:695)
at android.view.View.buildDrawingCache(View.java:6646)
at android.view.ViewGroup.onAnimationStart(ViewGroup.java:1345)
at android.view.ViewGroup.drawChild(ViewGroup.java:1591)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2054)
at android.view.ViewRoot.draw(ViewRoot.java:1632)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1335)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1991)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:4358)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud) android ×10
bitmap ×5
image ×2
imageview ×2
memory-leaks ×2
animation ×1
decode ×1
downsampling ×1
java ×1
pixelate ×1
stack-trace ×1
webview ×1
xml ×1