使用ImageView的OutOfMemory错误 [英] OutOfMemory Error using ImageView
问题描述
我试图使使用ImageView的壁纸集的应用程序。我知道它很难显示一些图片(尤其是当图像是1920×1080),我所做的就是让其他许多使用,将被显示在应用程序中一个较小的分辨率(400x200)的图片,但是当用户试图设置一张照片作为墙纸它得到相同的图像,但具有更大的分辨率。
我认为这将解决我的问题,但它并没有,应用程序,然后运行之前有更多的时间,但在目前它失败。我注意到,当我设置3图像作为壁纸应用程序失败。我try'd使用垃圾收集,这是行不通的。任何想法?
下面是我的code。
包app.technozed.winterwallpapers;进口java.io.IOException异常;
进口android.os.Bundle;
进口android.app.Activity;
进口android.app.WallpaperManager;
进口android.view.Menu;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.Button;
进口android.widget.ImageView;
进口android.widget.Toast;公共类MainActivity扩展活动实现OnClickListener {ImageView的显示;
INT toPhone;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
toPhone = R.drawable.wal1; 显示=(ImageView的)findViewById(R.id.WPdisplay);
ImageView的此搜索=(ImageView的)findViewById(R.id.WPimg1);
ImageView的IMAGE2 =(ImageView的)findViewById(R.id.WPimg2);
ImageView的图像3 =(ImageView的)findViewById(R.id.WPimg3);
ImageView的图片4 =(ImageView的)findViewById(R.id.WPimg4);
ImageView的图像5 =(ImageView的)findViewById(R.id.WPimg5);
ImageView的图片6 =(ImageView的)findViewById(R.id.WPimg6);
ImageView的图片7 =(ImageView的)findViewById(R.id.WPimg7);
ImageView的图片8 =(ImageView的)findViewById(R.id.WPimg8);
ImageView的图片9 =(ImageView的)findViewById(R.id.WPimg9);
ImageView的image10 =(ImageView的)findViewById(R.id.WPimg10);
ImageView的image11 =(ImageView的)findViewById(R.id.WPimg11);
ImageView的image12 =(ImageView的)findViewById(R.id.WPimg12);
ImageView的image13 =(ImageView的)findViewById(R.id.WPimg13);
ImageView的image14 =(ImageView的)findViewById(R.id.WPimg14);
ImageView的image15 =(ImageView的)findViewById(R.id.WPimg15);
ImageView的image16 =(ImageView的)findViewById(R.id.WPimg16);
ImageView的image17 =(ImageView的)findViewById(R.id.WPimg17);
ImageView的image18 =(ImageView的)findViewById(R.id.WPimg18);
ImageView的image19 =(ImageView的)findViewById(R.id.WPimg19);
ImageView的image20 =(ImageView的)findViewById(R.id.WPimg20);
ImageView的image21 =(ImageView的)findViewById(R.id.WPimg21);
ImageView的image22 =(ImageView的)findViewById(R.id.WPimg22);
ImageView的image23 =(ImageView的)findViewById(R.id.WPimg23);
ImageView的image24 =(ImageView的)findViewById(R.id.WPimg24);
ImageView的image25 =(ImageView的)findViewById(R.id.WPimg25);
ImageView的image26 =(ImageView的)findViewById(R.id.WPimg26);
ImageView的image27 =(ImageView的)findViewById(R.id.WPimg27);
ImageView的image28 =(ImageView的)findViewById(R.id.WPimg28);
ImageView的image29 =(ImageView的)findViewById(R.id.WPimg29);
ImageView的image30 =(ImageView的)findViewById(R.id.WPimg30);
按钮setWall =(按钮)findViewById(R.id.BsetWall);
image1.setOnClickListener(本);
image2.setOnClickListener(本);
image3.setOnClickListener(本);
image4.setOnClickListener(本);
image5.setOnClickListener(本);
image6.setOnClickListener(本);
image7.setOnClickListener(本);
image8.setOnClickListener(本);
image9.setOnClickListener(本);
image10.setOnClickListener(本);
image11.setOnClickListener(本);
image12.setOnClickListener(本);
image13.setOnClickListener(本);
image14.setOnClickListener(本);
image15.setOnClickListener(本);
image16.setOnClickListener(本);
image17.setOnClickListener(本);
image18.setOnClickListener(本);
image19.setOnClickListener(本);
image20.setOnClickListener(本);
image21.setOnClickListener(本);
image22.setOnClickListener(本);
image23.setOnClickListener(本);
image24.setOnClickListener(本);
image25.setOnClickListener(本);
image26.setOnClickListener(本);
image27.setOnClickListener(本);
image28.setOnClickListener(本);
image29.setOnClickListener(本);
image30.setOnClickListener(本);
setWall.setOnClickListener(本);
}@覆盖
公共布尔onCreateOptionsMenu(菜单菜单){
//充气菜单;如果是present这增加了项目操作栏。
。getMenuInflater()膨胀(R.menu.main,菜单);
返回true;
}
@覆盖
公共无效的onClick(视图v){
开关(v.getId()){
案例R.id.WPimg1:
display.setImageResource(R.drawable.wal1);
toPhone = R.drawable.wal1;
打破;
案例R.id.WPimg2:
display.setImageResource(R.drawable.wal2);
toPhone = R.drawable.wal2;
打破;
案例R.id.WPimg3:
display.setImageResource(R.drawable.wal3);
toPhone = R.drawable.wal3;
打破;
案例R.id.WPimg4:
display.setImageResource(R.drawable.wal4);
toPhone = R.drawable.wal4;
打破;
案例R.id.WPimg5:
display.setImageResource(R.drawable.wal5);
toPhone = R.drawable.wal5;
打破;
案例R.id.WPimg6:
display.setImageResource(R.drawable.wal6);
toPhone = R.drawable.wal6;
打破;
案例R.id.WPimg7:
display.setImageResource(R.drawable.wal7);
toPhone = R.drawable.wal7;
打破;
案例R.id.WPimg8:
display.setImageResource(R.drawable.wal8);
toPhone = R.drawable.wal8;
打破;
案例R.id.WPimg9:
display.setImageResource(R.drawable.wal9);
toPhone = R.drawable.wal9 ;;
打破;
案例R.id.WPimg10:
display.setImageResource(R.drawable.wal10);
toPhone = R.drawable.wal10;
打破;
案例R.id.WPimg11:
display.setImageResource(R.drawable.wal11);
toPhone = R.drawable.wal11;
打破;
案例R.id.WPimg12:
display.setImageResource(R.drawable.wal12);
toPhone = R.drawable.wal12;
打破;
案例R.id.WPimg13:
display.setImageResource(R.drawable.wal13);
toPhone = R.drawable.wal13;
打破;
案例R.id.WPimg14:
display.setImageResource(R.drawable.wal14);
toPhone = R.drawable.wal14;
打破;
案例R.id.WPimg15:
display.setImageResource(R.drawable.wal15);
toPhone = R.drawable.wal15;
打破;
案例R.id.WPimg16:
display.setImageResource(R.drawable.wal16);
toPhone = R.drawable.wal16;
打破;
案例R.id.WPimg17:
display.setImageResource(R.drawable.wal17);
toPhone = R.drawable.wal17;
打破;
案例R.id.WPimg18:
display.setImageResource(R.drawable.wal18);
toPhone = R.drawable.wal18;
打破;
案例R.id.WPimg19:
display.setImageResource(R.drawable.wal19);
toPhone = R.drawable.wal19;
打破;
案例R.id.WPimg20:
display.setImageResource(R.drawable.wal20);
toPhone = R.drawable.wal20;
打破;
案例R.id.WPimg21:
display.setImageResource(R.drawable.wal21);
toPhone = R.drawable.wal21;
打破;
案例R.id.WPimg22:
display.setImageResource(R.drawable.wal22);
toPhone = R.drawable.wal22;
打破;
案例R.id.WPimg23:
display.setImageResource(R.drawable.wal23);
toPhone = R.drawable.wal23;
打破;
案例R.id.WPimg24:
display.setImageResource(R.drawable.wal24);
toPhone = R.drawable.wal24;
打破;
案例R.id.WPimg25:
display.setImageResource(R.drawable.wal25);
toPhone = R.drawable.wal25;
打破;
案例R.id.WPimg26:
display.setImageResource(R.drawable.wal26);
toPhone = R.drawable.wal26;
打破;
案例R.id.WPimg27:
display.setImageResource(R.drawable.wal27);
toPhone = R.drawable.wal27;
打破;
案例R.id.WPimg28:
display.setImageResource(R.drawable.wal28);
toPhone = R.drawable.wal28;
打破;
案例R.id.WPimg29:
display.setImageResource(R.drawable.wal29);
toPhone = R.drawable.wal29;
打破;
案例R.id.WPimg30:
display.setImageResource(R.drawable.wal30);
toPhone = R.drawable.wal30;
打破;
案例R.id.BsetWall:
尝试{
WallpaperManager.getInstance(getApplicationContext())setResource(toPhone)。
Toast.makeText(getApplicationContext(),壁纸设定!,Toast.LENGTH_SHORT).show();
}赶上(IOException异常五){
e.printStackTrace();
Toast.makeText(getApplicationContext(),无特权!,Toast.LENGTH_SHORT).show();
}
打破;
} } }
这里是LogCat中。
---分配失败的缩放位图
关闭VM
主题ID = 1:螺纹未捕获的异常退出(组= 0x41618ba8)
致命异常:主要
工艺:app.technozed.winterwallpapers,PID:2574
java.lang.OutOfMemoryError
在android.graphics.BitmapFactory.nativeDe $ C $检测板(本机方法)
在android.graphics.BitmapFactory.de codeStream(BitmapFactory.java:587)
在android.graphics.BitmapFactory.de codeResourceStream(BitmapFactory.java:422)
在android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
在android.content.res.Resources.loadDrawable(Resources.java:2110)
在android.content.res.Resources.getDrawable(Resources.java:700)
在android.widget.ImageView.resolveUri(ImageView.java:638)
在android.widget.ImageView.setImageResource(ImageView.java:367)
在app.technozed.winterwallpapers.MainActivity.onClick(MainActivity.java:143)
在android.view.View.performClick(View.java:4438)
在android.view.View $ PerformClick.run(View.java:18422)
在android.os.Handler.handleCallback(Handler.java:733)
在android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:136)
在android.app.ActivityThread.main(ActivityThread.java:5017)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
在dalvik.system.NativeStart.main(本机方法)
移动图像,以一个名为绘-nodpi新文件夹。
原因
在不同的文件夹中绘制的图像是由不同的内存分配android系统的开通,华电国际表示将采取的记忆有很多即使图像是微小的。
绘-nodpi是最好的记忆保存。
i'm trying to make a wallpaper set app using ImageView. I know its hard to display a bunch of images (especially when images are 1920x1080), what i did was to make other bunch of images with a smaller resolution (400x200) that would be displayed in the app, but when user is trying to set a image as wallpaper it gets the same image but with the bigger resolution. I thought this will solve my problem, but it didn't, the app runs more time then before, but at a moment it fails. I noticed that the app fails after i set 3 images as wallpaper. I try'd to use garbage collector, it doesn't work. Any ideas?
Here is my code.
package app.technozed.winterwallpapers;
import java.io.IOException;
import android.os.Bundle;
import android.app.Activity;
import android.app.WallpaperManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
ImageView display;
int toPhone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toPhone = R.drawable.wal1;
display = (ImageView) findViewById(R.id.WPdisplay);
ImageView image1 = (ImageView) findViewById(R.id.WPimg1);
ImageView image2 = (ImageView) findViewById(R.id.WPimg2);
ImageView image3 = (ImageView) findViewById(R.id.WPimg3);
ImageView image4 = (ImageView) findViewById(R.id.WPimg4);
ImageView image5 = (ImageView) findViewById(R.id.WPimg5);
ImageView image6 = (ImageView) findViewById(R.id.WPimg6);
ImageView image7 = (ImageView) findViewById(R.id.WPimg7);
ImageView image8 = (ImageView) findViewById(R.id.WPimg8);
ImageView image9 = (ImageView) findViewById(R.id.WPimg9);
ImageView image10 = (ImageView) findViewById(R.id.WPimg10);
ImageView image11 = (ImageView) findViewById(R.id.WPimg11);
ImageView image12 = (ImageView) findViewById(R.id.WPimg12);
ImageView image13 = (ImageView) findViewById(R.id.WPimg13);
ImageView image14 = (ImageView) findViewById(R.id.WPimg14);
ImageView image15 = (ImageView) findViewById(R.id.WPimg15);
ImageView image16 = (ImageView) findViewById(R.id.WPimg16);
ImageView image17 = (ImageView) findViewById(R.id.WPimg17);
ImageView image18 = (ImageView) findViewById(R.id.WPimg18);
ImageView image19 = (ImageView) findViewById(R.id.WPimg19);
ImageView image20 = (ImageView) findViewById(R.id.WPimg20);
ImageView image21 = (ImageView) findViewById(R.id.WPimg21);
ImageView image22 = (ImageView) findViewById(R.id.WPimg22);
ImageView image23 = (ImageView) findViewById(R.id.WPimg23);
ImageView image24 = (ImageView) findViewById(R.id.WPimg24);
ImageView image25 = (ImageView) findViewById(R.id.WPimg25);
ImageView image26 = (ImageView) findViewById(R.id.WPimg26);
ImageView image27 = (ImageView) findViewById(R.id.WPimg27);
ImageView image28 = (ImageView) findViewById(R.id.WPimg28);
ImageView image29 = (ImageView) findViewById(R.id.WPimg29);
ImageView image30 = (ImageView) findViewById(R.id.WPimg30);
Button setWall = (Button) findViewById(R.id.BsetWall);
image1.setOnClickListener(this);
image2.setOnClickListener(this);
image3.setOnClickListener(this);
image4.setOnClickListener(this);
image5.setOnClickListener(this);
image6.setOnClickListener(this);
image7.setOnClickListener(this);
image8.setOnClickListener(this);
image9.setOnClickListener(this);
image10.setOnClickListener(this);
image11.setOnClickListener(this);
image12.setOnClickListener(this);
image13.setOnClickListener(this);
image14.setOnClickListener(this);
image15.setOnClickListener(this);
image16.setOnClickListener(this);
image17.setOnClickListener(this);
image18.setOnClickListener(this);
image19.setOnClickListener(this);
image20.setOnClickListener(this);
image21.setOnClickListener(this);
image22.setOnClickListener(this);
image23.setOnClickListener(this);
image24.setOnClickListener(this);
image25.setOnClickListener(this);
image26.setOnClickListener(this);
image27.setOnClickListener(this);
image28.setOnClickListener(this);
image29.setOnClickListener(this);
image30.setOnClickListener(this);
setWall.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.WPimg1:
display.setImageResource(R.drawable.wal1);
toPhone = R.drawable.wal1;
break;
case R.id.WPimg2:
display.setImageResource(R.drawable.wal2);
toPhone = R.drawable.wal2;
break;
case R.id.WPimg3:
display.setImageResource(R.drawable.wal3);
toPhone = R.drawable.wal3;
break;
case R.id.WPimg4:
display.setImageResource(R.drawable.wal4);
toPhone = R.drawable.wal4;
break;
case R.id.WPimg5:
display.setImageResource(R.drawable.wal5);
toPhone = R.drawable.wal5;
break;
case R.id.WPimg6:
display.setImageResource(R.drawable.wal6);
toPhone = R.drawable.wal6;
break;
case R.id.WPimg7:
display.setImageResource(R.drawable.wal7);
toPhone = R.drawable.wal7;
break;
case R.id.WPimg8:
display.setImageResource(R.drawable.wal8);
toPhone = R.drawable.wal8;
break;
case R.id.WPimg9:
display.setImageResource(R.drawable.wal9);
toPhone = R.drawable.wal9;;
break;
case R.id.WPimg10:
display.setImageResource(R.drawable.wal10);
toPhone = R.drawable.wal10;
break;
case R.id.WPimg11:
display.setImageResource(R.drawable.wal11);
toPhone = R.drawable.wal11;
break;
case R.id.WPimg12:
display.setImageResource(R.drawable.wal12);
toPhone = R.drawable.wal12;
break;
case R.id.WPimg13:
display.setImageResource(R.drawable.wal13);
toPhone = R.drawable.wal13;
break;
case R.id.WPimg14:
display.setImageResource(R.drawable.wal14);
toPhone = R.drawable.wal14;
break;
case R.id.WPimg15:
display.setImageResource(R.drawable.wal15);
toPhone = R.drawable.wal15;
break;
case R.id.WPimg16:
display.setImageResource(R.drawable.wal16);
toPhone = R.drawable.wal16;
break;
case R.id.WPimg17:
display.setImageResource(R.drawable.wal17);
toPhone = R.drawable.wal17;
break;
case R.id.WPimg18:
display.setImageResource(R.drawable.wal18);
toPhone = R.drawable.wal18;
break;
case R.id.WPimg19:
display.setImageResource(R.drawable.wal19);
toPhone = R.drawable.wal19;
break;
case R.id.WPimg20:
display.setImageResource(R.drawable.wal20);
toPhone = R.drawable.wal20;
break;
case R.id.WPimg21:
display.setImageResource(R.drawable.wal21);
toPhone = R.drawable.wal21;
break;
case R.id.WPimg22:
display.setImageResource(R.drawable.wal22);
toPhone = R.drawable.wal22;
break;
case R.id.WPimg23:
display.setImageResource(R.drawable.wal23);
toPhone = R.drawable.wal23;
break;
case R.id.WPimg24:
display.setImageResource(R.drawable.wal24);
toPhone = R.drawable.wal24;
break;
case R.id.WPimg25:
display.setImageResource(R.drawable.wal25);
toPhone = R.drawable.wal25;
break;
case R.id.WPimg26:
display.setImageResource(R.drawable.wal26);
toPhone = R.drawable.wal26;
break;
case R.id.WPimg27:
display.setImageResource(R.drawable.wal27);
toPhone = R.drawable.wal27;
break;
case R.id.WPimg28:
display.setImageResource(R.drawable.wal28);
toPhone = R.drawable.wal28;
break;
case R.id.WPimg29:
display.setImageResource(R.drawable.wal29);
toPhone = R.drawable.wal29;
break;
case R.id.WPimg30:
display.setImageResource(R.drawable.wal30);
toPhone = R.drawable.wal30;
break;
case R.id.BsetWall:
try{
WallpaperManager.getInstance(getApplicationContext()).setResource(toPhone);
Toast.makeText(getApplicationContext(), "Wallpaper was set!", Toast.LENGTH_SHORT).show();
} catch(IOException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "No privileges!", Toast.LENGTH_SHORT).show();
}
break;
}
}
}
And here is the LogCat.
--- allocation failed for scaled bitmap
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x41618ba8)
FATAL EXCEPTION: main
Process: app.technozed.winterwallpapers, PID: 2574
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
at android.content.res.Resources.loadDrawable(Resources.java:2110)
at android.content.res.Resources.getDrawable(Resources.java:700)
at android.widget.ImageView.resolveUri(ImageView.java:638)
at android.widget.ImageView.setImageResource(ImageView.java:367)
at app.technozed.winterwallpapers.MainActivity.onClick(MainActivity.java:143)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Move the images to a new folder called "drawable-nodpi".
Reason
Images in different drawable folders are opened by the android system with different memory allocations, hdpi means it will take a LOT of memory even if the image is tiny.
drawable-nodpi is the best for memory saving.
这篇关于使用ImageView的OutOfMemory错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!