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
取决于分辨率的高低。然后,您可能不喜欢它的外观。