内存不足即使我的图片小于2 MB

时间:2017-06-24 12:18:34

标签: java android

我正在制作一个动画登录界面...我的代码如下

@Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

ImageView i = (ImageView)findViewById(R.id.img1);
    if (i == null) throw new AssertionError();
    i.setBackgroundResource(R.drawable.animation_pulse);
    AnimationDrawable pro = (AnimationDrawable)i.getDrawable();
    pro.start();

但是当我在模拟器中执行应用程序时,它会显示

java.lang.OutOfMemoryError: Failed to allocate a 17280012 byte allocation with 
4194304 free bytes and 15MB until OOM 

虽然我的可绘制文件小于2mb,甚至以下代码也无济于事。

android:largeHeap="true"

4 个答案:

答案 0 :(得分:1)

尝试使用一些图像加载器库。这将解决问题。

  1. Glide

  2. Picasso

  3. UML

  4. Fresco

  5. 这些Glide最好:)

    gradle依赖项:

    // if you need jar ,please download it from https://mvnrepository.com/artifact/com.github.bumptech.glide/glide
    compile group: 'com.github.bumptech.glide', name: 'glide', version: '3.8.0'
    

    示例代码:

    Glide.with(context)
                    .load(your drawable)
                    .override(yoursize, yoursize)
                     .into(new Target<Drawable>() {
                        @Override
                        public void onStart() {
    
                        }
    
                        @Override
                        public void onStop() {
    
                        }
    
                        @Override
                        public void onDestroy() {
    
                        }
    
                        @Override
                        public void onLoadStarted(Drawable placeholder) {
    
                        }
    
                        @Override
                        public void onLoadFailed(Exception e, Drawable errorDrawable) {
    
                        }
    
                        @Override
                        public void onResourceReady(Drawable resource, GlideAnimation<? super Drawable> glideAnimation) {
                           imageview.setImageDrawable(resource);
                           //start animation here
                        }
    
                        @Override
                        public void onLoadCleared(Drawable placeholder) {
    
                        }
    
                        @Override
                        public void getSize(SizeReadyCallback cb) {
    
                        }
    
                        @Override
                        public void setRequest(Request request) {
    
                        }
    
                        @Override
                        public Request getRequest() {
                            return null;
                        }
                    })
    

答案 1 :(得分:0)

  

请在清单文件中添加此内容,然后查看魔法

  • android:largeHeap="true"
  • android:hardwareAccelerated="false"

快乐的编码!!

答案 2 :(得分:0)

在anroidmenifest.xml上发布这个

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

答案 3 :(得分:0)

目前,将图片从res/drawable/移至res/drawable-nodpi/res/drawable/res/drawable-mdpi/的同义词,因此您说800x600是-mdpi屏幕所需的分辨率(大约160dpi)。在更高密度的设备上,Android会自动扩展此类资源以保持相同的物理大小(5&#34; x 3.5&#34;),这会增加图像的内存消耗。

虽然此更改有所帮助,但您仍会在许多设备上遇到OutOfMemoryErrors。您将需要完全摆脱这个动画,或者用不需要大约60MB堆空间的其他东西(800像素×600像素×4字节/像素×33图像)替换它。