3

我正在开发一个应用程序,其中一个活动是一个非常复杂的代码,不同的视图在一个布局中膨胀,比如 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

在您的情况下,使用位图优化内存使用的最佳方法是保存您的 ImageViews 列表,在为每个 ImageView 调用 finish() 之前执行此操作:

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

也使用代码中的onPause代码,活动的主要布局具有 id top_layout

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

在搜索并看到上面的答案后,我只通过修改 Android 用户的代码编写了一个简单的片段。我已经使用了这个成功的工作。这个代码 setCallback 视图的背景,甚至回收所有当前使用的位图。

     @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 回答