This question already has answers here:
OutOfMemory exception when loading bitmap from external storage
(13个回答)
5年前关闭。
我的应用使用网络上的图像设置墙纸。但是,当我尝试通过BitmapFactory使用
码:
公共无效setWallpaperMethod(){
变量
有人知道如何解决此OutOfMemory异常吗?所有帮助表示赞赏。
瞧!
(这是假设墙纸管理器正确处理过大的图像,但是很可能是这种情况)
(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