【发布时间】:2014-08-06 16:59:07
【问题描述】:
我的应用使用来自网络的图像来设置壁纸。但是,当我尝试使用 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 异常吗?感谢所有帮助。
【问题讨论】:
-
那是因为图像对于设备来说很大。检查图像是否不大于 1024。
-
为什么不用
public void setStream (InputStream data)而不是setBitmap? -
njzk2:我自己编写了代码,将几个不同来源的代码拼接在一起,所以它可能并不完美:P
-
鉴于问题是关于壁纸管理器的,并且重复问题中给出的答案 a/ 与接受的答案不同,并且 b/ 在这种情况下不相关,并且考虑到接受的答案此问题不适用于重复问题,我投票支持重新提出问题。
标签: java android out-of-memory