gpt4 book ai didi

android - 内存不足异常

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:33 25 4
gpt4 key购买 nike

我开发了一款用于阅读书籍的 Android 应用程序。书页和音频是从 Amazon Bucket 下载的。下载后存储在 SD 卡上。

我为下一页和上一页放置了两个按钮。当我显示页面时,出现内存不足异常。

11-03 10:59:39.199: E/AndroidRuntime(13566): FATAL EXCEPTION: main
11-03 10:59:39.199: E/AndroidRuntime(13566): java.lang.OutOfMemoryError
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:324)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.graphics.drawable.Drawable.createFromPath(Drawable.java:880)
11-03 10:59:39.199: E/AndroidRuntime(13566): at org.Infoware.childrenbible.GeneralHelper.setImgfromSDCard(GeneralHelper.java:608)
11-03 10:59:39.199: E/AndroidRuntime(13566): at org.Infoware.childrenbible.CoverPageActivity.onCreate(CoverPageActivity.java:205)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.app.Activity.performCreate(Activity.java:4465)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.app.ActivityThread.access$600(ActivityThread.java:123)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.os.Handler.dispatchMessage(Handler.java:99)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.os.Looper.loop(Looper.java:137)
11-03 10:59:39.199: E/AndroidRuntime(13566): at android.app.ActivityThread.main(ActivityThread.java:4424)
11-03 10:59:39.199: E/AndroidRuntime(13566): at java.lang.reflect.Method.invokeNative(Native Method)
11-03 10:59:39.199: E/AndroidRuntime(13566): at java.lang.reflect.Method.invoke(Method.java:511)
11-03 10:59:39.199: E/AndroidRuntime(13566): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-03 10:59:39.199: E/AndroidRuntime(13566): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-03 10:59:39.199: E/AndroidRuntime(13566): at dalvik.system.NativeStart.main(Native Method)

这是我的 Java 代码:

public class PageReadActivity extends Activity 
{
Bitmap bitmap;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
try
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.pageread_layout);
}
catch (Exception ex)
{
ex.printStackTrace();
Log.d(TAG, "Error in onCreate");
}
}

@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
displayPage(product_code, page_Index);

btnNext.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
page_Index = page_Index + 1;
displayPage(product_code, page_Index);

}
});

btnPrevious.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
page_Index = page_Index - 1;
displayPage(product_code, page_Index);

}
});

}

private void displayPage(String product_code, int ind)
{
try
{
String imageName = product_code + ind + ".jpg";

String imgFilePath = objHelper.getFullFilePath(imageName);

File imageFile = new File(imgFilePath);

imgViewPage = new ImageView(myContext);

if(imageFile.exists())
{

bitmap = objHelper.decodeSampledBitmapFromResource(imageName,objHelper.screenWidth,objHelper.screenHeight);

imgViewPage.setImageBitmap(bitmap);
bitmap = null;

String audioName = product_code+"_audio" + ind + ".mp3";
String audioFilePath = objHelper.getFullFilePath(audioName);

File audioFile = new File(audioFilePath);

if(audioFile.exists())
{
progressBarWaiting.setVisibility(View.INVISIBLE);
stopAudio();
playAudio(ind);
}

}
else
{
System.out.println("Image not exists.....");
}
}
catch (Exception ex)
{
ex.printStackTrace();
Log.e(TAG, "ERROR in displayPage");
}
}

@Override
protected void onDestroy()
{
super.onDestroy();
objHelper.unbindDrawables(findViewById(R.id.pageReadLayout));
System.gc();
}

public void unbindDrawables(View view)
{
if(view.getBackground() != null)
{
view.getBackground().setCallback(null);
}

if(view instanceof ViewGroup && !(view instanceof AdapterView))
{
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++)
{
unbindDrawables(((ViewGroup) view).getChildAt(i));
}

((ViewGroup) view).removeAllViews();
}
}

public Bitmap decodeSampledBitmapFromResource(String fileName,int reqWidth, int reqHeight)
{

String imagePath = getFullFilePath(fileName);

@SuppressWarnings("unused")
File imgFile = new File(imagePath);

// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imagePath,options);

// Calculate inSampleSize
options.inSampleSize = 1;

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;

return BitmapFactory.decodeFile(imagePath,options);
}
}

最佳答案

Bitmap 将图像的原始大小 x 4 转换。因此它占用更多由 android 指定给您的应用程序的堆。

当您的 Bitmap 不再需要时使用它

bitmap.recycle();
bitmap = null;

关于android - 内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13226195/

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