在 ImageActivity 中使用 HttpURLConnection 下載圖片並設置到 ImageView,但圖片無法顯示。代碼關鍵片段:
String imageUrl = "https://content.52pk.com/files/100623/2230_102437_1_lit.jpg";
// ...
HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
AndroidManifest.xml 中未聲明:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
沒有 INTERNET 權限,任何網路請求都會拋出 SecurityException。
代碼在 onCreate() 中直接發起 HTTP 請求,Android 4.0+ (API 14+) 默認禁止主線程網路 I/O,會拋出 NetworkOnMainThreadException。
private class LoadImageTask extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
InputStream is = conn.getInputStream();
return BitmapFactory.decodeStream(is);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) imView.setImageBitmap(bitmap);
}
}
// 調用
new LoadImageTask().execute(imageUrl);
引入 Glide/Picasso/Coil,自動處理線程、緩存、生命週期:
// Glide
Glide.with(this).load(imageUrl).into(imView);
// Picasso
Picasso.get().load(imageUrl).into(imView);
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application ...>
<activity android:name=".ImageActivity" />
</application>
</manifest>
INTERNET 權限。