This question already has answers here:
OutOfMemory exception when loading bitmap from external storage
                                
                                    (13个回答)
                                
                        
                                5年前关闭。
            
                    
我的应用使用网络上的图像设置墙纸。但是,当我尝试通过BitmapFactory使用decodeStream时,速度较慢的手机上的某些用户会收到OutOfMemory异常。此图像永远不会显示在应用程序上,它只是被加载,然后设置为墙纸。我已经在线搜索过,但是找不到任何有助于解决问题的资源。

码:

公共无效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异常吗?所有帮助表示赞赏。

最佳答案

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

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

如您所见,这是一种解码,一种编码少。

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

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


瞧!

(这是假设墙纸管理器正确处理过大的图像,但是很可能是这种情况)

07-27 15:26