【发布时间】:2017-07-15 11:15:07
【问题描述】:
我正在开发壁纸应用程序。我编写了一个 AsyncTask 来从选定的 url 下载照片并将其加载为墙纸(全部在背景中)。现在,AsyncTask 有时会起作用。而且我自己无法理解无法从 URL 加载/下载图像(作为位图)的原因。两个 url(好的和坏的)都在工作并在浏览器上加载正确的图像。
我的 AsyncTask 类:
@Override
protected Void doInBackground(String... params) {
Bitmap output = null;
try {
URL url = new URL(params[0]);
Log.d(TAG, "_log: output URL is: "+url.toString());
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream inputStream = connection.getInputStream();
output = BitmapFactory.decodeStream(inputStream);
Log.d(TAG, "_log: output size "+output.getByteCount());
} catch (MalformedURLException e) {
e.printStackTrace();
Log.d(TAG, "_log: output with MalformedURLException "+e.toString());
} catch (IOException e) {
Log.d(TAG, "_log: output with IOException "+e.toString());
e.printStackTrace();
} catch (Exception e) {
Log.d(TAG, "_log: output with Exception "+e.toString());
e.printStackTrace();
} finally {
if (output != null) util.setupWallpaper(context, output);
else Log.d(TAG, "_log: output is null");
}
return null;
}
setupWallpaper 函数是:
public void setupWallpaper(Context context, Bitmap image) {
WallpaperManager wallpaperManager = WallpaperManager.getInstance(context);
try {
if (image == null) {
makeToast(context, "Image is null!");
} else {
wallpaperManager.setBitmap(image);
}
} catch (IOException e) {
e.printStackTrace();
}
}
当我试图获取空对象的大小时,错误只是一个堆栈跟踪异常,输出。
output with Exception java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getByteCount()' on a null object reference
RetrieveFeed.doInBackground(RetrieveFeed.java:57)
RetrieveFeed.doInBackground(RetrieveFeed.java:27)
- 好网址: https://images.unsplash.com/photo-1487239954692-e6a970698056?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&s=a98f159f3fb718fe2f5a24703ee75930
- 错误的网址: https://images.unsplash.com/photo-1487221967119-451b79e10235?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&s=bd41a3caa8886f9b150915f7cfa002e8
权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
我没有尝试将此图像加载到任何 imageView 中,而是将此图像发送到 WallPaperManager 以作为墙纸加载。
我想指出,我用 Glide 尝试了同样的事情并且出现了同样的结果!
【问题讨论】:
-
小提示 - 你不需要设置 setDoInput(true) 因为这个值默认为真
-
你为什么不试试Picaso 而不是用 AsyncTask 来做呢?
-
您是独立加载还是按顺序加载这些 URL。您是否尝试更改订单?
-
那么您需要将您的解决方案与以下developer.android.com/topic/performance/graphics/…结合起来
-
@VadimKotov,对不起,伙计。自2016年以来我一直没有从事android开发。但我认为您不应该在移动端转换图像。后端开发者必须要么压缩图像,要么给你两个或三个 URL,如 HD、720 和 480,这样你就可以加载任何你想要的。尝试在移动端压缩图片,会给设备带来压力,并且在不同的设备类型上会得到不可预知的结果。
标签: java android exception android-asynctask