这是与这个问题有关的
java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
我创建了有问题的转储文件..它提供以下信息
One instance of "byte[]" loaded by "<system class loader>" occupies 1,10,59,216 (51.02%) bytes. The memory is accumulated in one instance of "byte[]" loaded by "<system class loader>". Keywords byte[]
那么现在可以做什么呢?我如何清除问题?
我的list_objects [context] -inbound文件
CLASS NAME SHALLOW HEAP RETAINED HEAP byte[11059200] @ 0xb4979590 | 1,216 | 1,216 mBuffer android.graphics.Bitmap @ 0xb3dc68d8 |48 | 48 mBitmap android.graphics.drawable.BitmapDrawable @ 0xb3dbba60 | 72 | 144 mBackground android.widget.RelativeLayout @ 0xb3db3fc0 |512 | 10,144 mBitmap android.graphics.drawable.BitmapDrawable$BitmapState @ 0xb3dc0068 |40 | 40 mBitmapState android.graphics.drawable.BitmapDrawable @ 0xb3dbba60 |72 | 144 referent java.lang.ref.WeakReference @ 0xb3dc2d68 |24 | 24
请帮助我绝望我如何解决内存问题?
我的home_screen.java
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.home_page); main(); private void main() { // Todo Auto-generated method stub final Button home; final Button aboutus; final Button contacts; final Button clients; final Button services; try { home = (Button)findViewById(R.id.btnHome); aboutus = (Button)findViewById(R.id.btnAboutus); clients = (Button)findViewById(R.id.btnClients); contacts = (Button)findViewById(R.id.btnContacts); services = (Button)findViewById(R.id.btnServices); home.setonClickListener(new OnClickListener() { @Override public void onClick(View v) { // Todo Auto-generated method stub Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.home1); Drawable d = new BitmapDrawable(getResources(),b); home.setBackgroundDrawable(d); System.gc(); Intent myIntent = new Intent(Home_Screen.this,Button_Anime.class); startActivity(myIntent); } }); aboutus.setonClickListener(new OnClickListener() { @Override public void onClick(View v) { // Todo Auto-generated method stub Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.about1 ); Drawable d = new BitmapDrawable(getResources(),b); aboutus.setBackgroundDrawable(d); Intent myIntent = new Intent(Home_Screen.this,AboutUs.class); startActivity(myIntent); } }); clients.setonClickListener(new OnClickListener() { @Override public void onClick(View v) { // Todo Auto-generated method stub Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.clients1 ); Drawable d = new BitmapDrawable(getResources(),b); clients.setBackgroundDrawable(d); Intent myIntent = new Intent(Home_Screen.this,Clients.class); startActivity(myIntent); } }); contacts.setonClickListener(new OnClickListener() { @Override public void onClick(View v) { // Todo Auto-generated method stub Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.contact1); Drawable d = new BitmapDrawable(getResources(),b); contacts.setBackgroundDrawable(d); Intent myIntent = new Intent(Home_Screen.this,Contacts.class); startActivity(myIntent); } }); services.setonClickListener(new OnClickListener() { @Override public void onClick(View v) { // Todo Auto-generated method stub Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.services1 ); Drawable d = new BitmapDrawable(getResources(),b); services.setBackgroundDrawable(d); Intent myIntent = new Intent(Home_Screen.this,Services.class); startActivity(myIntent); } }); } catch(Exception e) { e.printstacktrace(); } }
解决方法
这个想法是缩小您的图像,使其在较小的屏幕上看起来不错,而且您不必在内存中加载整个位图.
1)首先得到您将要显示的ImageView /屏幕的大小.
2)通过传递BitmapFactory.Options.inJustDecodeBounds来读取Bitmap的大小.这将为您提供Bitmap的大小,而不是加载整个位图.
3)获取采样大小.计算屏幕的高度和宽度与图像高度和宽度的比率.使用最小的一个,使最大的尺寸看起来不错.
2)(代码)
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inJustDecodeBounds = true; BitmapFactory.decodeStream(inputStream,null,bitmapOptions); int imageWidth = bitmapOptions.outWidth; int imageHeight = bitmapOptions.outHeight; inputStream.close();
4)(代码)
private Bitmap downscaleBitmapUsingDensities(final int sampleSize,final int imageResId) { final Options bitmapOptions=new Options(); bitmapOptions.inDensity=sampleSize; bitmapOptions.inTargetDensity=1; final Bitmap scaledBitmap=BitmapFactory.decodeResource(getResources(),imageResId,bitmapOptions); scaledBitmap.setDensity(Bitmap.DENSITY_NONE); return scaledBitmap; }
原文地址:https://www.jb51.cc/java/126314.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。