Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内存不足,即使我的图片小于2MB_Java_Android - Fatal编程技术网

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

Java 内存不足,即使我的图片小于2MB,java,android,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

我正在制作一个动画登录屏幕…我的代码如下

@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"
请将此添加到您的清单文件中,然后查看魔法

  • android:largeHeap=“true”
  • android:hardwareAccelerated=“false”

快乐编码

尝试使用一些imageloader库。那会解决问题的

  • 统一建模语言

  • 从这些滑翔是最好的:)

    渐变依赖项:

    // 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;
                        }
                    })
    
    示例代码:

    // 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;
                        }
                    })
    
    Glide.with(上下文)
    .装载(您的可牵引)
    .override(yoursize,yoursize)
    .into(新目标){
    @凌驾
    public void onStart(){
    }
    @凌驾
    公共void onStop(){
    }
    @凌驾
    公共空间{
    }
    @凌驾
    已开始加载公共void(可绘制占位符){
    }
    @凌驾
    public void onload失败(异常e,可提取错误可提取){
    }
    @凌驾
    
    public void onResourceReady(可绘制资源,GlideAnimationtru-this on-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">
    

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


    虽然这一更改会有所帮助,但在许多设备上仍会遇到
    OutOfMemoryErrors
    。您需要完全删除此动画,或者将其替换为不需要~60MB堆空间的其他动画(800像素x 600像素x 4字节/像素x 33图像)。

    图像文件可能是2mb,但这是压缩的(例如,使用jpeg)。加载到内存时,必须将其解码为原始像素数据,该数据通常要大很多倍。错误消息中显示,您的动画的一个图像在内存中为17mb。您的图像分辨率是多少?如何处理它…因为我不懂…我的动画共有33帧…每帧约为30KB png…@GaneshPatil…800x600是我的分辨率“800x600是我的分辨率”-您正在加载的图像比这大得多。此可绘制资源在您的开发机器上的具体位置?(
    res/drawable/
    res/drawable nodpi/
    ?其他可绘制目录?)首先,并不是所有的设备实际上都分配了一个更大的堆。第二,请求更大的堆的应用会给用户带来麻烦,因为更大的堆会更快地使其他应用程序内存不足。只有自我中心的开发者才会认为动画是一个大堆的理由。第三,即使在最好的情况下,这也只是推迟了问题的发生。最后,您将分割较大的堆。第四,开发人员已经在请求一个较大的堆。@Commonware解决方案是什么?请详细解释这是如何解决问题的。请详细解释这是如何解决问题的,以及它是如何改进其他答案的。我是否可以调整图像大小,然后使用动画?@nithinsampath:具有较低分辨率的帧将减少堆要求。是否足以避免
    OutOfMemoryErrors
    取决于分辨率的高低。然后,您可能不喜欢它的外观。