2012-11-05 126 views
3

我开发了一本用于读书的android应用程序。 Book页面和音频从Amazon Bucket下载。下载后存储在SD卡上。android - 内存不足异常

我把两个按钮放在下一页和上一页。当我显示页面时,它会给我带来内存异常。

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); 
} 
    } 
+0

改变这种options.inSampleSize = 4; –

回答

8

位图转换图像的原始大小x 4,所以它占据这是由机器人指定您的应用程序更多的堆。

使用此当不再需要你的位图

bitmap.recycle(); 
bitmap = null; 
0

只是改变inSampleSize = 4,如果它不能正常工作,然后通过2的sequre增加它

+1

我已经做到了。但图像质量不好 – Mansi