2

写真を撮って後処理するためのカメラインテントハンドラーを書いてみました(必要な場合)。高解像度で写真を撮ると、プログラムが「割り当てが大きすぎます」と中断します。私がより低い解像度でいくつかを取るならば、私はより多くを取ることができますが、それも壊れます。いくつか検索した後、手動で作成したビットマップをリサイクルする必要があることがわかりました。しかし、問題は消えませんでした。私の主な問題は、1。コードにメモリリークがあるかどうかわからないことです。2。なぜそれがメモリを割り当てようとしているのかわからないので、プログラムにビットマップを表示しません(今のところ) 、さらに再利用するために保存します。

public void onClick(View view) {
    Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
    this.mLastPic = new File(this.mFs.getDirPath(), this.mFs.getNextPicName()); //create and save a file for pic
    i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.mLastPic));
    this.startActivityForResult(i, 0);
}

onactivty結果ハンドラー

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == Activity.RESULT_OK && requestCode == 0) {

        try {
            if(!this.mController.getSetting(R.string.USE_HEIGH_RESOLUTION)) { //use high res or not
                int quality = this.mFs.getPicQuality(); //get compress quality
                Bitmap pic = BitmapFactory.decodeFile(this.mLastPic.getPath());
                ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                pic.compress(Bitmap.CompressFormat.JPEG, quality, outStream);
                String path = this.mLastPic.getPath();
                if(this.mLastPic.delete()) { //replace the old file with a now file
                    File newFile = new File(path);
                    newFile.createNewFile();
                    FileOutputStream os = new FileOutputStream(newFile);
                    os.write(outStream.toByteArray());
                    Log.d("newEntryActivity.onActivityResult", "replaced pic ");
                } else {
                    Log.d("newEntryActivity.onActivityResult", "cant delete old pic");
                }
                pic.recycle(); //cleaning up
                outStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

logcatは示しています

05-09 14:35:01.694:E / dalvikvm-heap(845):6380496バイトの外部割り当てがこのプロセスには大きすぎます。05-09 14:35:01.694:E /(845):VMは6380496バイトを割り当てさせません

05-09 14:35:01.694:D / AndroidRuntime(845):VMをシャットダウンしています

05-09 14:35:01.694:W / dalvikvm(845):threadid = 3:キャッチされない例外でスレッドが終了します(group = 0x4001b188)

05-09 14:35:01.694:E / AndroidRuntime(845):キャッチされていないハンドラー:キャッチされていない例外のためにスレッドメインが終了します

05-09 14:35:01.714:E / AndroidRuntime(845):java.lang.RuntimeException:アクティビティを開始できませんComponentInfo {unicorn.Heurazio / unicorn.Heurazio.SettingsActivity}:android.view.InflateException:バイナリXMLファイルの行# 2:クラスの膨張エラー..。

05-09 14:35:01.714:E / AndroidRuntime(845):原因:android.view.InflateException:バイナリXMLファイル行#2:クラスの拡張エラー

05-09 14:35:01.714:E / AndroidRuntime(845):android.view.LayoutInflater.createView(LayoutInflater.java:513)

05-09 14:35:01.714:E / AndroidRuntime(845):com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)

05-09 14:35:01.714:E / AndroidRuntime(845):android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)

05-09 14:35:01.714:E / AndroidRuntime(845):android.view.LayoutInflater.inflate(LayoutInflater.java:385)

05-09 14:35:01.714:E / AndroidRuntime(845):android.view.LayoutInflater.inflate(LayoutInflater.java:320)

05-09 14:35:01.714:E / AndroidRuntime(845):android.view.LayoutInflater.inflate(LayoutInflater.java:276)

05-09 14:35:01.714:E / AndroidRuntime(845):com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)

05-09 14:35:01.714:E / AndroidRuntime(845):android.app.Activity.setContentView(Activity.java:1622)

05-09 14:35:01.714:E / AndroidRuntime(845):unicorn.Heurazio.SettingsActivity.onCreate(SettingsActivity.java:38)で

05-09 14:35:01.714:E / AndroidRuntime(845):android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

05-09 14:35:01.714:E / AndroidRuntime(845):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)

05-09 14:35:01.714:E / AndroidRuntime(845):...11詳細

05-09 14:35:01.714:E / AndroidRuntime(845):原因:java.lang.reflect.InvocationTargetException

05-09 14:35:01.714:E / AndroidRuntime(845):android.widget.LinearLayout。(LinearLayout.java:92)

05-09 14:35:01.714:E / AndroidRuntime(845):java.lang.reflect.Constructor.constructNative(ネイティブメソッド)

05-09 14:35:01.714:E / AndroidRuntime(845):java.lang.reflect.Constructor.newInstance(Constructor.java:446)で

05-09 14:35:01.714:E / AndroidRuntime(845):android.view.LayoutInflater.createView(LayoutInflater.java:500)

05-09 14:35:01.714:E / AndroidRuntime(845):... 21 more

05-09 14:35:01.714:E / AndroidRuntime(845):原因:java.lang.OutOfMemoryError:ビットマップサイズがVMバジェットを超えています

05-09 14:35:01.714:E / AndroidRuntime(845):android.graphics.Bitmap.nativeCreate(ネイティブメソッド)> 05-09 14:35:01.714:E / AndroidRuntime(845):android.graphics Bitmap.createBitmap(Bitmap.java:468)

05-09 14:35:01.714:E / AndroidRuntime(845):android.graphics.Bitmap.createBitmap(Bitmap.java:435)で

05-09 14:35:01.714:E / AndroidRuntime(845):android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340)で

05-09 14:35:01.714:E / AndroidRuntime(845):android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488)で

05-09 14:35:01.714:E / AndroidRuntime(845):android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462)で

05-09 14:35:01.714:E / AndroidRuntime(845):android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)で

05-09 14:35:01.714:E / AndroidRuntime(845):android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)

05-09 14:35:01.714:E / AndroidRuntime(845):android.content.res.Resources.loadDrawable(Resources.java:1705)

05-09 14:35:01.714:E / AndroidRuntime(845):android.content.res.TypedArray.getDrawable(TypedArray.java:548)

05-09 14:35:01.714:E / AndroidRuntime(845):android.view.View。(View.java:1850)

05-09 14:35:01.714:E / AndroidRuntime(845):android.view.View。(View.java:1799)

05-09 14:35:01.714:E / AndroidRuntime(845):android.view.ViewGroup。(ViewGroup.java:284)

どんな助けでも素晴らしいでしょう。

アレックスよろしく

4

3 に答える 3

1

ログを調べると、のビューを膨らませているときに大きな(〜6MB)ビットマップ割り当てが発生しているように見えますunicorn.Heurazio.SettingsActivity。リソースをチェックして、どこかの背景に大きなビットマップを使用しているかどうかを確認してください。

于 2012-05-09T16:59:23.313 に答える
0

オーバーロードされたアプリケーションでバックグラウンドへの参照を追加したり、不要なコンテキスト要素をすべて消去したりするなど、プログラムを読んで変更した後も、同じ問題が発生し、さらに悪化しているようです。

ビットマップのサイズの計算を信頼できる場合

Bitmap tmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.logo);
Log.d("mainApp", tmp.getRowBytes() * tmp.getHeight() / 1024 + "kB");

私の100kBロゴ(.png)は6mBRAMを取ります(これは例外メッセージに適合します)。どんなアイデアでも素晴らしいでしょう。

于 2012-05-11T00:13:13.880 に答える
-3

アプリケーションにマニフェストを追加してみてくださいandroid:largeHeap="true"

于 2012-05-09T15:24:39.633 に答える