无法从Android

时间:2017-02-24 14:57:52

标签: java android exception android-asynctask

我正在开发一款壁纸应用。我编写了一个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();
    }
}

错误只是一个stackTrace捕获异常,而我试图获取null对象的大小,输出。

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)

权限:

<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"/>

我没有尝试将此Image加载到任何imageView中,我将此Image发送到WallPaperManager以加载为Wallpaper。

我想指出我和Glide尝试了同样的事情并且出现了相同的结果!

2 个答案:

答案 0 :(得分:1)

如果我是你,我会使用Picasso Library来处理所有这些问题 Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); 这行代码从您指定的URL下载图像并将其加载到imageView

但是你需要先在build gradle中编译它 有关详细信息,请访问library site

答案 1 :(得分:1)

(代表OP发布)

问题是,坏的url图像太大而无法处理,因此Bitmap无声地失败。

D/skia: --- too Large Progressive Image (1, 5184 x 3456)> limit(16777216)
D/skia: --- decoder->decode returned false