3

私は、1つのアクティビティが非常に複雑なコードであり、webview (sdcardのhtmlファイルと画像を使用)、imageviews、scrollsなどの単一のレイアウトでさまざまなビューが膨らんでいるアプリに取り組んでいます。このアクティビティを開始すると、これらのエラーが発生します。

        E/AndroidRuntime(600): Caused by: java.lang.reflect.InvocationTargetException
        E/AndroidRuntime(600):  at java.lang.reflect.Constructor.constructNative(Native Method)
        E/AndroidRuntime(600):  at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
        E/AndroidRuntime(600):  at android.view.LayoutInflater.createView(LayoutInflater.java:586)
        E/AndroidRuntime(600):  ... 29 more
        E/AndroidRuntime(600): Caused by: java.lang.OutOfMemoryError
        E/AndroidRuntime(600):  at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
        E/AndroidRuntime(600):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:483)
        E/AndroidRuntime(600):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
        E/AndroidRuntime(600):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
        E/AndroidRuntime(600):  at android.content.res.Resources.loadDrawable(Resources.java:1935)
        E/AndroidRuntime(600):  at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
        E/AndroidRuntime(600):  at android.view.View.<init>(View.java:2785)
        E/AndroidRuntime(600):  at android.view.View.<init>(View.java:2722)
        E/AndroidRuntime(600):  at android.view.ViewGroup.<init>(ViewGroup.java:379)
        E/AndroidRuntime(600):  at android.widget.RelativeLayout.<init>(RelativeLayout.java:174)
        E/AndroidRuntime(600):  ... 32 more

この問題を解決する方法私はこのコードを試しましたが、それでも何をすべきかわかりませんか?

 @Override
    protected void onDestroy() {
    super.onDestroy();

    unbindDrawables(findViewById(R.id.rootView));
    System.gc();
    }

    private void unbindDrawables(View view) {
        if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
        ((ViewGroup) view).removeAllViews();
        }
    }

この問題を解決するための可能な方法は何ですか?助けてください

4

3 に答える 3

3

あなたのケースでビットマップでメモリ使用量を最適化する最良の方法は、ImageView のリストを保存して、すべての ImageView に対して finish() を呼び出す前にこれを行うことです。

((BitmapDrawable) myImageView.getDrawable()).getBitmap().recycle();
myImageView = null;

onPauseid を持つアクティビティのメイン レイアウトを使用して、コード内のコードも使用しtop_layoutます。

@Override
protected void onPause() {
    super.onPause();
    unbindDrawables(findViewById(R.id.top_layout));
    System.gc();
}
于 2013-01-31T07:57:15.820 に答える
2

上記の回答を検索して見た後、Android User.I のコードを変更するだけで簡単なスニペットを作成しました。これは正常に機能しています。

     @Override
        protected void onDestroy() {
        super.onDestroy();

        unbindDrawables(findViewById(R.id.rootView));
        System.gc();
        }

 static void unbindDrawables(View view) {
     try{
     System.out.println("UNBINDING"+view);
            if (view.getBackground() != null) {

                ((BitmapDrawable)view.getBackground()).getBitmap().recycle();


                view.getBackground().setCallback(null);
                view=null;
            }

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

    }catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
 }   

編集:

サイズが 20 kb 未満の画像を使用して今日発見した新しいことは、メモリの最適化に適しているため、メモリ不足エラーを経験する必要が少なくなります。

于 2013-01-31T13:21:16.840 に答える
1

画像のピクセルが制限を超えると、OutOfMemoryExceptionが発生します(最大解像度は2048 * 2048)

Bitmapfactory.Options-を使用して、画像のピクセルを減らすことができます。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap myBitmap = BitmapFactory.decodeFile(mUri.getPath(),options);
Drawable d = new BitmapDrawable(Resources.getSystem(),myBitmap);
updateDrawable(d);

アクティビティで画像を使用している間は、解像度を下げてください。

注-inSampleSize=2は、サイズが1/2になり、解像度が1/4に減少することを意味します。

inSampleSizeの値を2の累乗に保つようにしてください。これでも、最良の結果が得られます。

うまくいけば、それはあなたのためにうまくいきます。ご不明な点がございましたら、コメントしてください。

于 2013-01-31T08:37:07.790 に答える