Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上的UI元素之间是否共享图像资源?_Android_Image_Caching_Memory_Xamarin - Fatal编程技术网

Android上的UI元素之间是否共享图像资源?

Android上的UI元素之间是否共享图像资源?,android,image,caching,memory,xamarin,Android,Image,Caching,Memory,Xamarin,我正在创建一个简单的Android应用程序,我正在调查一些内存不足的问题。 该应用程序由6个活动组成,每个活动都有一个主题、一些按钮、一些图像等。 主题的设置如下所示: <?xml version="1.0" encoding="UTF-8" ?> <resources> <style name="Theme.Normal" parent="android:Theme"> <item name="android:windowBackgroun

我正在创建一个简单的Android应用程序,我正在调查一些内存不足的问题。 该应用程序由6个活动组成,每个活动都有一个主题、一些按钮、一些图像等。 主题的设置如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<resources>
  <style name="Theme.Normal" parent="android:Theme">
    <item name="android:windowBackground">@drawable/bg640x960</item>
    <item name="android:windowNoTitle">true</item>
  </style>
  <style name="Theme.Blur" parent="android:Theme">
    <item name="android:windowBackground">@drawable/bgblur640x960</item>
    <item name="android:windowNoTitle">true</item>
  </style>
</resources>
<ImageView
    p1:src="@drawable/logo"
    p1:layout_width="match_parent"
    p1:layout_height="match_parent"
    p1:id="@+id/imageView2" />
var intent = new Intent(this, typeof(InfoPage));
StartActivity(intent);
当我在活动之间导航时,我遇到了内存不足异常:

at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x00028>
at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (intptr,intptr,intptr,Android.Runtime.JValue[]) <0x000e7>
at Android.App.Activity.SetContentView (int) <0x001e7>
at SPS.Android.QuestionPage.OnCreate (Android.OS.Bundle) <0x0005b>
at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) <0x0005b>
at (wrapper dynamic-method) object.d6c8c709-4564-4172-820d-ca61f7c48e36 (intptr,intptr,intptr) <0x00043>

  --- End of managed exception stack trace ---
android.view.InflateException: Binary XML file line #1: Error inflating class <unknown>
    at android.view.LayoutInflater.createView(LayoutInflater.java:626)
    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:675)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:700)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:361)
    at android.app.Activity.setContentView(Activity.java:1956)
    at sps.android.QuestionPage.n_onCreate(Native Method)
    at sps.android.QuestionPage.onCreate(QuestionPage.java:38)
    at android.app.Activity.performCreate(Activity.java:5372)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
    at android.app.ActivityThread.access$700(ActivityThread.java:159)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5419)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
    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:600)
    ... 27 more
Caused by: java.lang.OutOfMemoryError
    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:832)
    at android.content.res.Resources.loadDrawable(Resources.java:2988)
    at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
    at android.view.View.<init>(View.java:3563)
    at android.widget.TextView.<init>(TextView.java:881)
    at android.widget.Button.<init>(Button.java:108)
    at android.widget.Button.<init>(Button.java:104)
位于System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在Android.Runtime.JNIEnv.CallNonvirtualVoidMethod(intptr、intptr、intptr、Android.Runtime.JValue[])中
位于Android.App.Activity.SetContentView(int)
在SPS.Android.QuestionPage.OnCreate(Android.OS.Bundle)上
在Android.App.Activity.n_OnCreate_Landroid_os_Bundle_(intptr、intptr、intptr)
at(包装器动态方法)object.d6c8c709-4564-4172-820d-ca61f7c48e36(intptr、intptr、intptr)
---托管异常堆栈跟踪的结束---
android.view.InflateException:二进制XML文件行#1:膨胀类时出错
位于android.view.LayoutInflater.createView(LayoutInflater.java:626)
在com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)上
位于android.view.LayoutInflater.onCreateView(LayoutInflater.java:675)
位于android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:700)
位于android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
位于android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
位于android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
在android.view.LayoutInflater.inflate(LayoutInflater.java:498)
在android.view.LayoutInflater.inflate(LayoutInflater.java:398)
在android.view.LayoutInflater.充气(LayoutInflater.java:354)
位于com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:361)
位于android.app.Activity.setContentView(Activity.java:1956)
在sps.android.QuestionPage.n_onCreate(本机方法)
在sps.android.QuestionPage.onCreate上(QuestionPage.java:38)
位于android.app.Activity.performCreate(Activity.java:5372)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
在android.app.ActivityThread.access$700(ActivityThread.java:159)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:5419)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:525)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1209)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
在dalvik.system.NativeStart.main(本机方法)
原因:java.lang.reflect.InvocationTargetException
位于java.lang.reflect.Constructor.constructNative(本机方法)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:417)
在android.view.LayoutInflater.createView中(LayoutInflater.java:600)
... 还有27个
原因:java.lang.OutOfMemoryError
在android.graphics.BitmapFactory.NativeDecodeset(本机方法)
位于android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
位于android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
位于android.graphics.drawable.drawable.createFromResourceStream(drawable.java:832)
位于android.content.res.Resources.loadDrawable(Resources.java:2988)
位于android.content.res.TypedArray.getDrawable(TypedArray.java:602)
在android.view.view.(view.java:3563)
位于android.widget.TextView。(TextView.java:881)
在android.widget.Button.(Button.java:108)
在android.widget.Button.(Button.java:104)
我的问题是:UI中使用的图像/绘图是否在UI元素之间共享

例如,6个活动中的4个共享相同的背景图像(在主题中)-希望这些背景图像不会在内存中重复4次

每个活动都有带有背景图像的按钮-背景图像只加载一次,对吗

或者我应该实现一个可绘制缓存(例如,在启动时加载并解码内存中的所有图像,并保持位图),然后在代码中的每个UI元素上手动设置可绘制缓存?(这似乎需要做很多工作)

我的APK只有8MB,我无法理解在这样一个简单的应用程序中是什么导致内存不足的问题

我用的是Xamarin.Android。
崩溃发生在具有1GB内存的三星Galaxy S3上。

是。资源是共享的,而不是重复的。

是的,根据Android开发者博客上的这篇老文章,可绘制内容在UI元素之间共享:

我从中引述:

但是,所有这些可绘制文件都有一个共同的状态,称为“常量状态”。该状态的内容根据您使用的可绘制文件的类型而有所不同,但它通常包含资源可以定义的所有属性。对于按钮,常量状态包含位图图像。这样,所有应用程序中的所有按钮共享相同的位图,从而节省大量内存


8 MB太大apk减小了apk@NaveenTamrakar:你能详细说明一下吗?@Naveentamakar-8MB对于apk文件来说一点也不太大。谷歌要求你将apk文件限制在50MB。apk的大小并没有引起这个问题。我建议使用Android提供的内存分析工具。请参阅以了解如何分析应用程序的内存使用情况。我知道google apk限制为50 mb,但您的设备(如small phone)中有256 mb内存,因此我们可以在thia设备中运行25mb apk