我的应用程序使用网络上的图像来设置壁纸。但是,当我尝试使用 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/