这与此问题有关
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[]
所以现在可以做些什么?我该如何清除问题?
my list_objects [context] -inbound file
CLASS NAME SHALLOW HEAP RETAINED HEAP
byte[11059200] @ 0xb4979590 | 1,10,59,216 | 1,10,59,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();
}
}
答案 0 :(得分:4)
我们的想法是对您的图像进行下采样,使其在较小的屏幕上看起来很好,并且您不必将整个位图加载到内存中。
1)首先获得您将要显示的ImageView /屏幕的大小。
2)通过传入 BitmapFactory.Options.inJustDecodeBounds 来读取Bitmap的大小。这将为您提供Bitmap的大小,而不是加载整个位图。
3)获取样本大小。计算屏幕高度和宽度与图像高度和宽度的比率。使用最小的尺寸,使最大的尺寸看起来不错。
4)最后使用下面的函数来获取不会消耗你记忆的下采样图像。
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;
}
答案 1 :(得分:2)
添加largeHeap =&#34; true&#34;在您的清单中可能有所帮助这将允许您的应用程序使用更多内存。
请参阅:http://developer.android.com/guide/topics/manifest/application-element.html
答案 2 :(得分:1)
尝试以下代码:
Resources res = getContext().getResources();
int id = R.drawable.image;
Bitmap b = BitmapFactory.decodeResource(res, id);
_img .setimagebitmap(b);
答案 3 :(得分:1)
通常情况下,当我在低Ram设备上遇到这种异常时,因为我的某种图像对于这种分辨率来说很昂贵(很多kb)。 我有一个奇怪的问题,因为我只使用xhdpi和hdpi drawables目录,在mdpi或甚至ldpi设备上hdpi转换为正确的分辨率会引发此异常,因为无法调整图像大小。
它发生在任何设备上?你能检查一下这个低端设备的特定图形吗?
使用HPOF文件,你可以看到什么样的对象,或者至少,活动/视图有问题。 您需要分析所有这些数据(没有一个主计划来查找它折叠您的应用程序的资源)以查看哪个数据存在问题。
希望这有帮助,任何问题,请随时提出。