4

本を読むためのAndroidアプリを1つ開発しています。本のページと音声は Amazon Bucket からダウンロードされます。ダウンロード後、SDカードに保存。

次のページと前のページの 2 つのボタンを配置します。ページを表示すると、メモリ不足の例外が発生します。

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

3 に答える 3

8

Bitmap は、画像の元のサイズ x 4 を変換します。そのため、android によってアプリに指定されているより多くのヒープを占有します。

ビットマップが不要になったときにこれを使用します

bitmap.recycle();
bitmap = null;
于 2012-11-05T05:09:33.113 に答える
2

私の推測では、ビットマップが適切に処理されておらず、OutofMemoryException が作成されています。使用されていないビットマップはリサイクルする必要があります。ここを見てください。. また、ここでMAT Analyzer を使用してメモリ リークを見つける方法もご覧ください。

于 2012-11-05T05:10:12.323 に答える
0

変更するだけinSampleSize = 4です。機能していない場合は、2のシーケンスで増やします。

于 2012-11-05T05:26:41.707 に答える