我正在尝试通过“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;
}
questionNumber
和getQuestionImageUrl()
已经过测试,并且正在返回我认为正确的值(1和http://www.perlgurl.org/Android/BeenThereDoneThat/Questions/q1.png
)。该网址上有一个图片,但我总是得到例外。我已经尝试了几种变体,但当它们都没有工作时,我从书中回到了这段代码。我在这里做错了什么?
我是java和android的新手,所以我可能会错过一些简单的东西。我在本书中的代码和网站上的更新代码中遇到了许多其他问题(所有这些问题都在这里或developer.android.com
解决)。这是我的第一个问题,所以如果我没有提供任何信息,请告诉我。
答案 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