gpt4 book ai didi

java - 内存不足异常+分析hprof文件转储

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:59 27 4
gpt4 key购买 nike

这与这个问题有关:

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]-入站文件:

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();
}
}

最佳答案

想法是对图像进行降采样,使其在较小的屏幕上看起来不错,并且您不必将整个位图加载到内存中。

1) 首先获取您将在其上显示的 ImageView/屏幕的大小。

2) 通过传入BitmapFactory.Options.inJustDecodeBounds 读取您的位图大小。这将为您提供位图的大小,而不是加载整个位图。

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;
}

关于java - 内存不足异常+分析hprof文件转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24155628/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com