解码位图流失败

时间:2012-11-06 18:29:31

标签: java android

我正在尝试通过“Sam在24小时内自学Android应用程序开发”并在第12小时陷入困境。问题似乎出现在本节中:

private Drawable getQuestionImageDrawable(int questionNumber) {
    Drawable image;
    URL imageUrl;

    try {
        // Create a Drawable by decoding a stream from a remote URL
        imageUrl = new URL(getQuestionImageUrl(questionNumber));
        InputStream stream = imageUrl.openStream();
        Bitmap bitmap = BitmapFactory.decodeStream(stream);
        image = new BitmapDrawable(getResources(), bitmap);
    } catch (Exception e) {
        Log.e(TAG, "Decoding Bitmap stream failed");
        image = getResources().getDrawable(R.drawable.noquestion);
    }
    return image;
}

questionNumbergetQuestionImageUrl()已经过测试,并且正在返回我认为正确的值(1和http://www.perlgurl.org/Android/BeenThereDoneThat/Questions/q1.png)。该网址上有一个图片,但我总是得到例外。我已经尝试了几种变体,但当它们都没有工作时,我从书中回到了这段代码。我在这里做错了什么?

我是java和android的新手,所以我可能会错过一些简单的东西。我在本书中的代码和网站上的更新代码中遇到了许多其他问题(所有这些问题都在这里或developer.android.com解决)。这是我的第一个问题,所以如果我没有提供任何信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

我会做以下事情,它可能会有效:

private Drawable getQuestionImageDrawable(int questionNumber) {
Drawable image;
URL imageUrl;

try {
    // Create a Drawable by decoding a stream from a remote URL
    imageUrl = new URL(getQuestionImageUrl(questionNumber));
    HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
    conn.setDoInput(true);
    conn.connect();
    InputStream stream = conn.getInputStream();
    Bitmap bitmap = BitmapFactory.decodeStream(stream);
    image = new BitmapDrawable(getResources(), bitmap);
} catch (Exception e) {
    Log.e(TAG, "Decoding Bitmap stream failed");
    image = getResources().getDrawable(R.drawable.noquestion);
}
return image;
}

确保在主要操作系统的后台线程中执行此类繁重操作,并对应用程序的清单具有INERNET权限。 让我知道你的进展。

答案 1 :(得分:0)

可能异常是因为您正在通过app ui线程建立网络连接。这适用于较旧的Android版本,但不适用于较新的版本。 看看Android network operation section

要做的主要是使用AsyncTask