java - 解码位图时出现 OutOfMemory 异常

标签 java android out-of-memory

我的应用程序使用网络上的图像来设置壁纸。但是,当我尝试使用 decodeStream 时使用 BitmapFactory 时,某些速度较慢的手机上的用户会遇到 OutOfMemory 异常。该图像永远不会显示在应用程序上,它只是加载,然后设置为壁纸。我在网上搜索过,但找不到任何有助于解决问题的资源。

代码:

公共(public)无效setWallpaperMethod(){

    InputStream in = null;
    try {
        in = new java.net.URL(urldisplay).openStream();
    } catch (MalformedURLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    final Bitmap bitmap = BitmapFactory.decodeStream(in);
    myWallpaperManager = WallpaperManager
            .getInstance(getApplicationContext());

    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                myWallpaperManager.setBitmap(bitmap);
                Toast.makeText(MainActivity.this,
                        "Teamwork! Wallpaper set.", Toast.LENGTH_LONG)
                        .show();
            } catch (IOException e) {
                Toast.makeText(
                        MainActivity.this,
                        "Damnit, clickers! Wallpaper wasn't set. Try killing and restarting the app?",
                        Toast.LENGTH_LONG).show();
            }
        }

    });

}

变量urldisplay是一个字符串,等于一个 URL(例如,imgur 图像)。此外,该方法在线程中运行,因此不存在 UI 线程锁定的风险。

有谁知道如何解决这个 OutOfMemory 异常吗?感谢所有帮助。

最佳答案

当前,您正在打开一个输入流,读取它,解码完整的位图,然后将其传递给管理器,管理器会将其转换为 png 并存储以供以后使用。

相反,您可以打开输入流,将其传递给管理器,管理器现在负责简单地存储它以供以后使用。

如您所见,这减少了一种解码和一种编码。

然后,壁纸管理器将负责显示图像,并相应地处理图像尺寸。

myWallpaperManager = WallpaperManager
        .getInstance(getApplicationContext());
myWallpaperManager.setStream(in);

瞧!

(假设壁纸管理器可以正确处理超大图像,但情况很可能如此)

关于java - 解码位图时出现 OutOfMemory 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25166024/

相关文章:

java - Thread、Arraylist对内存的影响 - Java

java - junit中如何处理异常

java - sessionFactory 的正确使用方法

android - 为什么在android中按下按钮不激活 toast ?

Android轮播图片库

out-of-memory - HttpClient Head请求内存异常PCL

iphone - 创建 NSArray - EXC_BAD_ACCESS?

java - 为什么不能将整数转换为字符串?

java - 为什么 Maven Ear 包使用项目的旧 jar 版本,尽管 war 子项目包含最新的 jar 版本?

java - 我想在我的 Homefragment.java 类的 recyclerview 中添加水平滚动的卡片 View