尝试解码流时膨胀类时出错

2024-01-23

我累坏了。我一整天都在做这件事。在我的应用程序中,我有 100 个 ImageView,但出现 java.outofmemory 错误,因此我决定解码并调整文件大小,但我无法管理它工作。 有人可以看一下代码并给我建议吗?

主要活动代码:公共类 MainActivity 扩展 Activity 实现 OnClickListener {

ImageView display;
int toPhone;
private Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    System.gc();
    context = this;
    toPhone = R.drawable.wal1;
    display = (ImageView) findViewById(R.id.WPdisplay);
    ImageView image1 = (ImageView) findViewById(R.id.WPimg1);
    ImageView image2 = (ImageView) findViewById(R.id.WPimg2);
    ImageView image3 = (ImageView) findViewById(R.id.WPimg3);
    ImageView image4 = (ImageView) findViewById(R.id.WPimg4);
    ImageView image5 = (ImageView) findViewById(R.id.WPimg5);
    Button setWall = (Button) findViewById(R.id.BsetWall);
    image1.setOnClickListener(this);
    image2.setOnClickListener(this);
    image3.setOnClickListener(this);
    image4.setOnClickListener(this);
    image5.setOnClickListener(this);
    setWall.setOnClickListener(this);
    }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public Bitmap decodeAndResizeFile(int resID) {
     try {
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;

我认为在下一行中我遇到了问题,因为它说未使用局部变量 bmp 的值

            Bitmap bmp= BitmapFactory.decodeResource(context.getResources(), resID, o);
           // BitmapFactory.decodeStream(new FileInputStream(f), null, o);

            // The new size we want to scale to
            final int REQUIRED_SIZE = 70;

            // Find the correct scale value. It should be the power of 2.
            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.decodeResource(context.getResources(), resID, o2);

     } finally {

        }
    }

@Override
public void onClick(View v) {
    Bitmap bmpp;
    switch (v.getId()){
    case R.id.WPimg1:
         display.setImageResource(R.drawable.wal1);
         toPhone = R.drawable.wal1;

在下一行中,我尝试对其进行解码(并且我正在对每个图像执行此操作)

         bmpp = decodeAndResizeFile(toPhone);
         //Bitmap bmpp = decodeAndResizeFile(file);
         break;
    case R.id.WPimg2:
         display.setImageResource(R.drawable.wal2);
         toPhone = R.drawable.wal2;  
         bmpp = decodeAndResizeFile(toPhone);
        display.setImageBitmap(bmpp);
         break;
    case R.id.WPimg3:
         display.setImageResource(R.drawable.wal3);
         toPhone = R.drawable.wal3;
         bmpp = decodeAndResizeFile(toPhone);
         break;
    case R.id.WPimg4:
         display.setImageResource(R.drawable.wal4);
         toPhone = R.drawable.wal4;
         bmpp = decodeAndResizeFile(toPhone);
         break;
    case R.id.WPimg5:
         display.setImageResource(R.drawable.wal5);
         toPhone = R.drawable.wal5;
         bmpp = decodeAndResizeFile(toPhone);
         break;
    case R.id.BsetWall:
         try{
             WallpaperManager.getInstance(getApplicationContext()).setResource(toPhone);
             Toast.makeText(getApplicationContext(), "Wallpaper was set!", Toast.LENGTH_SHORT).show();
         } catch(IOException e) {
             e.printStackTrace();
             Toast.makeText(getApplicationContext(), "No privileges!", Toast.LENGTH_SHORT).show();
         }
         break;
    }
    }
    }

这是我的 Logcat

--- decoder->decode returned false
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0xb3adbba8)
FATAL EXCEPTION: main
Process: app.technozed.testwall, PID: 1250
java.lang.RuntimeException: Unable to start activity ComponentInfo{app.technozed.testwall/app.technozed.testwall.MainActivity}: android.view.InflateException: Binary XML file line #304: Error inflating class <unknown>
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #304: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:620)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
at android.app.Activity.setContentView(Activity.java:1929)
at app.technozed.testwall.MainActivity.onCreate(MainActivity.java:28)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
... 11 more
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:594)
... 26 more
Caused by: java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
at android.content.res.Resources.loadDrawable(Resources.java:2110)
at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
at android.widget.ImageView.<init>(ImageView.java:129)
at android.widget.ImageView.<init>(ImageView.java:119)
... 29 more

如果在decodeAndResizeFile()中出现警告“未使用局部变量bmp的值”,则可以删除“Bitmap bmp =”部分并将其保留为:

BitmapFactory.decodeResource(context.getResources(), resID, o);

这是因为此调用使用 o.inJustDecodeBounds = true。在这种情况下,仅在对象“o”中返回尺寸,并返回空位图(因此没有必要存储它)。

在 switch 语句中,将每个 case 更改为如下所示:

case R.id.WPimg1:
    toPhone = R.drawable.wal1;
    bmpp = decodeAndResizeFile(toPhone);
    display.setImageBitmap(bmpp);
    break;

因此,在这里,您将资源解码为缩小的位图,然后将该位图分配给 ImageView。您不想或不需要这样做:

display.setImageResource(R.drawable.wal1);

...因为您冒着 OutOfMemoryException 的风险,并且无论如何您都会继续使用缩放的位图设置“显示”。进行这些更改后,您的代码对我有用。我可以看到壁纸预览图像,然后设置壁纸(不要忘记清单中的 SET_WALLPAPER 权限)。

但这并不能解释您的 logcat,这似乎是 onCreate() 膨胀 R.layout.activity_main 中的问题。在 logcat 快结束时,它再次显示 OutOfMemoryError。如果我将一个大 jpg 分配给 XML 中的 ImageView,我可以重新创建此错误(OOM 结果,因此布局无法膨胀)。当在 XML 中分配可绘制对象时,您无法“即时”缩小可绘制对象,因此请创建物理上较小的可绘制对象以在 XML 中使用。

EDIT:

当您单击图像时,“显示”会获取一个新的位图,而旧的位图有资格进行 GC。这是一种立即释放旧内存使用的内存的方法,无需等待 GC 启动:

将其从 onClick() 移至类变量:

Bitmap bmpp;  //Reference to the same bitmap that 'display' is using

然后在 onClick() 中:

Bitmap old_bm = null;  //Reference to hold the old bitmap
switch (v.getId()){
case R.id.WPimg1:
    old_bm = bmpp;  //Set to the bitmap currently being used by 'display'
    toPhone = R.drawable.wal1;
    bmpp = decodeAndResizeFile(toPhone);   //'display' now has a new bitmap
    display.setImageBitmap(bmpp);
    if (old_bm != null)
    {
        old_bm.recycle();  //Recyle the old bitmap
        old_bm = null;     //Clear the reference to allow GC to clean up fully
    }
    break;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试解码流时膨胀类时出错 的相关文章

  • 如何增加 Gradle 守护进程的最大堆大小?

    签署 apk 时 我收到以下消息 To run dex in process the Gradle daemon needs a larger heap It currently has 1024 MB For faster builds
  • 从 admob 独立 SDK 切换到 Google Play 服务 SDK 时,apk 大小会膨胀

    使用 Admob SDK 我的 apk 大小为 230Kb 当用 google play services SDK 替换 Admob SDK 时 它是 1 5MB 膨胀了 6 倍以上 我想完整的 Google Play 服务客户端 SDK
  • Android - 启用和禁用蓝牙 - SDK 3 (OS 1.5) - 以编程方式?

    我编写了代码来以编程方式启用和禁用各种功能 例如 Wifi 振铃模式 飞行模式 您将在电源切换小部件中看到的所有内容 我还没有找到如何做的一个是蓝牙 看来在 SDK level 3 OS 1 5 中没有漂亮的蓝牙管理器类 有没有人指出关于启
  • 垂直翻转 Android Canvas

    有没有一种简单的方法可以在 Android 中翻转画布 我似乎找不到任何可以让我垂直翻转它的东西 这样 y 轴上的零就是手机屏幕的底部而不是顶部 如果解决方案不是特别快也没关系 因为我没有对画布进行任何计算密集的操作 提前致谢 Try ca
  • Android 上 Java 库中的代码出现 NoClassDefFoundError

    我的用户经常遇到错误 应用程序在启动期间崩溃 当应该加载 MainActivity 时 VM 显然找不到该类 我不明白为什么 该应用程序的架构是 我的免费版和专业版都使用一个通用项目 不知道是否相关 请参阅下面的堆栈跟踪 有什么想法吗 ja
  • Firebase 云消息传递 - 如何验证令牌?

    我正在使用 Firebase Cloud Messaging FCM 并且每次在客户设备上生成新令牌时 都会根据下面的缩写代码 我将此新令牌发送到我的服务器数据库 云 并将其保存在其中 以便能够发送未来推送通知使用 CFM API 从服务器
  • 不同风格的模块文件

    我正在尝试在同一个应用程序中实现播放服务和华为服务 但希望能够按风格配置使用哪一个 每种风格都使用自己的 applicationIdSuffix 因此 对于每种不同的风格 华为插件都会失败 我无法编译 我的应用程序模块包含agconnect
  • 获取包含位图支持的画布的 Android 视图上的点的像素颜色值

    我正在尝试找出获取给定点上像素颜色值的最佳方法View http developer android com reference android view View html 我可以通过三种方式写入视图 我设置了背景图像View setBa
  • 如何修复运行 Android 模拟器时出现 GPU Driver Issue 错误

    我的 Android 模拟器几周前运行良好 但现在出现错误 当我运行代码时 GPU 驱动程序问题错误对话框与模拟器一起弹出 当我单击 确定 时 Android 模拟器不会按预期运行应用程序 错误如下 Your GPU driver info
  • 具有多个字符串的列表视图

    我正在尝试创建一个包含多个字符串的列表视图 现在我有一个可以实现的功能 while i lt 10 GETS DATA FROM WEBPAGE ETC a DATAFROMWEBPAGE1 b DATAFROMWEBPAGE2 c DAT
  • Eclipse Android 模拟器 - 键盘不工作

    我刚刚更新到最新的 SDK 版本 16 使用最新版本的 API 16 创建了新版本的 AVD 并且我的硬件键盘在模拟器上不再工作 甚至我的其他 avd 使用旧版本的 sdk 任何想法如何解决这一问题 您的 AVD 的 键盘支持 硬件属性是否
  • 为什么 Android 上的免安装应用有两种设置?

    我使用的是运行 Android 11 的 Pixel 3 我发现有 2 种不同的设置可以控制免安装应用的某些方面 设置 应用程序和通知 默认应用程序 打开链接 即时应用程序 即使未安装 也打开应用程序中的链接 切换默认为开 Google P
  • 如何从Android webview下载文件?

    我下面的代码可以很好地加载 url 页面 并且在搜索歌曲后 当我单击下载链接时 它崩溃了 关于如何让下载管理器与网络视图一起工作的教程并不多 我究竟做错了什么 import java io File import android app A
  • 无法在 Android Studio 中运行项目

    当我尝试在 Android Studio 中运行我的项目时 我收到以下错误消息 Execution failed for task CricHQ dexDebug gt com android ide common internal Log
  • 调用属于Fragment的Activity的函数

    我正在与多个Fragments在 Android 下 我对如何从嵌入式应用程序发送和接收数据感到困惑 为了简单的解释 我有一个ListFragment and a MapFragment使用解释的方法here https stackover
  • Android RxJava 2 JUnit 测试 - android.os.Looper 中的 getMainLooper 未模拟 RuntimeException

    我在尝试为正在使用的演示者运行 JUnit 测试时遇到 RuntimeExceptionobserveOn AndroidSchedulers mainThread 由于它们是纯 JUnit 测试而不是 Android 仪器测试 因此它们无
  • 使用Android Camera API,拍摄照片的方向始终未定义

    我使用相机API 拍摄的照片总是旋转90度 我想旋转它 所以首先我想知道图片的方向 这一点我被卡住了 我总是以两种方式得到未定义的方向 这是代码 Override public void onPictureTaken byte data C
  • 当应用程序从最近的应用程序中滑动时,前台服务会被终止,通知也会被删除

    我有一个foreground service有通知 当应用程序从最近的应用程序托盘中滑出时 服务将被终止 通知也会被删除 这是我的服务的代码VoiceService class Override public IBinder onBind
  • 如何在不下载子项的情况下从 Firebase 获取子项密钥?

    我有一个 Firebase 数据库 其中的节点 items 有很多子项 我想导入子项键的列表 由于每个子项都包含相当多我对此不感兴趣的数据 因此我想仅下载子项密钥 以最大程度地减少传输的数据量 为了便于说明 假设我有以下数据结构 然后我想获
  • Android:在surfaceview上实现admob

    我有一个使用 SurfaceView 的小游戏形式的活动 下面是代码片段 我很困惑如何在 SurfaceView 上实现 admob 请建议 public class DroidzActivity extends Activity priv

随机推荐

  • context-param可以在web.xml中引用吗?

    我可以在 DD 本身中引用上下文参数吗 例如
  • ReactiveList 和 WhenAny

    我有许多检查清单ReactiveLists具有ChangeTrackingEnabled true 我只想在每个列表中至少选中一项时启用 OkCommand 此外 我想确保用有效的字节值填充其他各种属性 我尝试执行以下操作 但它不起作用 t
  • 如何修改 Azure Functions 中本机注入的 IConfiguration

    我们需要add本地提供给 Azure Functions 的本机 IConfiguration 的配置提供程序 目前我们完全替换使用以下代码将其与我们的自定义 Iconfiguration 结合使用 public class Startup
  • OWIN app.use vs app.run vs app.map

    它们之间有什么区别app use app run app map in Owin http www asp net aspnet overview owin and katana 什么时候用什么 阅读文档时并不简单 app use将一个中间
  • 具有有限身份验证的附加组件无法打开侧边栏

    我有一个 Google 文档插件 它被编程为在文档打开时立即打开侧边栏 当然 这需要在文档中安装并启用该附加组件 我发现 一周以来 在我们的用例中非常有用的侧边栏自动打开功能不再起作用 在 StackDriver 日志中我看到此报告 onO
  • 在 MKMapView 上使用叠加层进行缩放时出现异常: NSInvalidArgumentException NSSetM removeObject:对象不能为 nil

    我添加了大约1000MKPolygon到一个MKMapView 将叠加层添加到MKMapView效果很好 但是 如果我快速放大和缩小 偶尔放开变焦 这样mapView处理它是新的visibleMapRect 我发现应用程序 有时 崩溃并出现
  • VIM 从 :shell 命令中打开文件

    假设我从 with VI 发出 shell 命令 然后我导航到一个目录并决定需要编辑我在那里看到的 foo txt 文件 有没有办法从 shell 返回 vi 并打开 foo txt 进行编辑 只要满足以下条件 就有办法实现你想要的 Vim
  • 压缩存档错误:无法访问该文件,因为该文件正在被另一个进程使用

    我想压缩一个路径 其中运行一个服务窗口 当服务停止时 它工作正常 当服务运行时 我有例外 该进程无法访问该文件 因为该文件正在被另一个进程使用 过程 但是 当我使用 7 zip 压缩时 没有任何异常 我的命令 Compress Archiv
  • 在两列之间的范围内搜索特定值python dataframe

    我有两个 csv 文件 根据 csv 文件 1 中单元格的值 我应该能够在 csv 文件 2 的列中搜索该值 并从 csv 文件 2 中的其他列获取相应的值 如果这很令人困惑 我很抱歉 通过插图可能会变得清楚 CSV 文件 1 Car Mi
  • 正则表达式仅允许字母和某些字符

    我正在尝试创建一个仅允许大写或小写字母以及空格字符 和 的正则表达式 这是我到目前为止所拥有的 但由于某种原因它仍然让我输入数字 a zA Z 任何帮助都会很棒 谢谢 在角色类别中很特殊 它用于定义一个范围 就像您所做的那样a z 匹配文字
  • 获取对从 AsyncTask 调用 Activity 的引用(不是作为内部类)

    是否有可能从不是调用 Activity 类的内部类的 AsyncTask 中获取对启动 AsyncTask 执行的 Activity 实例的引用 我知道这个线程 https stackoverflow com questions 23792
  • 如何使用模板专门化来查找成员函数参数类型等?

    我确信我以前见过这种描述 但现在我一辈子都找不到它 给定一个具有某种形式的成员函数的类 例如 int Foo Bar char double 如何使用模板和各种专业化来推断组成类型 例如 template
  • HttpContext 为空?

    是否可以这样说 当 Httpcontext 对象为 null 时 iis 就关闭了 我知道当第一个请求iis asp net 时应用程序管理器创建 环境 应用程序域 其中有应用程序运行时 里面有块 如果服务器上有超过 1 个应用程序 每个
  • 使用 Python 拆分 ps 的输出

    在 Linux 上 命令 ps aux 输出进程列表 其中每个统计数据包含多个列 例如 USER PID CPU MEM VSZ RSS TTY STAT START TIME COMMAND postfix 22611 0 0 0 2 5
  • 如何以编程方式删除广告的快捷方式?

    因此 我搞砸了一个 msi 安装程序 并仅在测试安装后部署了它 而不是卸载 我知道不好 在安装后添加了 exe 的运行 但忘记指定它只应在安装时发生 而不是在卸载时发生 我找到了Windows 安装程序清理 http support mic
  • php中如何将浮点值转换为整数?

    我想在 php 中将浮点值 例如 1 0000124668092E 14 转换为整数 php output 中最好的方法是什么应该是 100001246680920 你所说的转换是什么意思 铸件 int float or intval fl
  • 如何更改R闪亮中SelectInput周围区域的宽度

    我在 R 中有一个 SelectInput 它周围有很多空白 这是我的 ui r 中的选择输入 library shiny shinyUI pageWithSidebar headerPanel GetHeader sidebarPanel
  • 如何在多个客户端之间共享一个vimrc文件?

    有时我不是一个很有秩序的人 我经常发现自己处于丢失旧的完全调整过的 vimrc 文件并不得不重新开始的情况 或者在不同的客户端上有不同版本的 vimrc 文件 由于这个混乱对我来说已经失控 我想知道是否有一个好的方法来管理我的 vimrc
  • 无法在 Mojave 中升级 Python

    I ran brew outdated在 macOS Mojave 10 14 2 中并确定python and python 2已经过时了 当我跑的时候brew upgrade两者都失败了 例如对于python 2 gt Upgradin
  • 尝试解码流时膨胀类时出错

    我累坏了 我一整天都在做这件事 在我的应用程序中 我有 100 个 ImageView 但出现 java outofmemory 错误 因此我决定解码并调整文件大小 但我无法管理它工作 有人可以看一下代码并给我建议吗 主要活动代码 公共类