0

在我的应用程序中,我有 7 个单选按钮,每个按钮都会带你到一个特定的活动。所以总的来说,我有 8 项活动(家庭活动和 7 项内心活动)。

7 个内部活动中的每一个都有一个ViewFlipper,其中包含 5 到 8 个视图。

当我在OS version-2.2的设备或OS version-2.3.3的设备上运行此应用程序时,它工作正常,但是当我在OS version-4.0 的设备上运行相同的应用程序时,它会抛出java.lang.OutOfMemoryError,很少(任何地方,例如第二个活动的第三个屏幕ViewFlipper)。

SO上的此链接建议增加“最大VM应用程序堆大小”,但由于我正在设备上进行测试,所以这是不可能的。

这个其他链接建议对位图进行采样。我确实每个活动使用 15-20 个图像(1 个作为 5-8 个屏幕和一些附加图像的背景),但我只将所有图像设置在各自的xml文件中。我不对代码中的位图做任何事情。

在一个地方,我还发现使用了我在每个活动的onDestroy()中放置的unbindDrawables(),但无济于事。

此外,如果内存是真正的问题,那么它如何在 2.2 和 2.3.3 上工作,而在更新了操作系统和整体配置更好的 4.0 设备上却不能工作。

操作系统版本 4.0 中是否存在与此相关的错误?

有人可以指导我吗?

编辑(1)

日志猫

     android.view.InflateException: Binary XML file line #8: Error inflating class <unknown>
    at android.view.LayoutInflater.createView(LayoutInflater.java:606)
    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:653)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:823)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:729)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251)
    at android.app.Activity.setContentView(Activity.java:1835)
    at MYACTIVITYNAME.onCreate(MemberActivity.java:167)
    at android.app.Activity.performCreate(Activity.java:4465)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
    at android.app.ActivityThread.access$600(ActivityThread.java:123)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4424)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)


 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
    at android.view.LayoutInflater.createView(LayoutInflater.java:586)
    ... 27 more


 Caused by: java.lang.OutOfMemoryError
    at android.graphics.Bitmap.nativeCreate(Native Method)
    at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
    at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
    at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
    at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
    at android.content.res.Resources.loadDrawable(Resources.java:1935)
    at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
    at android.widget.ImageView.<init>(ImageView.java:119)
    at android.widget.ImageView.<init>(ImageView.java:109)
    ... 30 more
4

1 回答 1

0

您可能需要回收位图

我不知道这是否可以帮助你

使用此代码创建位图

将 IMAGE URI 传递给函数

      private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {
          BitmapFactory.Options o = new BitmapFactory.Options();
          o.inJustDecodeBounds = true;
          BitmapFactory.decodeStream(
                       getContentResolver().openInputStream(selectedImage), null, o);

          final int REQUIRED_SIZE = 100;

          int width_tmp = o.outWidth, height_tmp = o.outHeight;
          int scale = 1;
          while (true) {
                 if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) {
                       break;
                 }
                 width_tmp /= 2;
                 height_tmp /= 2;
                 scale *= 2;
          }

          BitmapFactory.Options o2 = new BitmapFactory.Options();
          o2.inSampleSize = scale;
          return BitmapFactory.decodeStream(
                       getContentResolver().openInputStream(selectedImage), null, o2);
   }
于 2013-09-20T11:53:32.133 回答