首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 網路圖片加載失敗:權限缺失與主線程網路操作雙重陷阱

     編輯:程式設計綜合問答

問題現象

在 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);

核心問題分析

1. 缺少網路權限聲明

AndroidManifest.xml 中未聲明:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

沒有 INTERNET 權限,任何網路請求都會拋出 SecurityException。

2. 主線程執行網路操作

代碼在 onCreate() 中直接發起 HTTP 請求,Android 4.0+ (API 14+) 默認禁止主線程網路 I/O,會拋出 NetworkOnMainThreadException。

解決方案

方案一:使用 AsyncTask (舊版 API 兼容)

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>

最佳實踐總結

  1. 必須聲明 INTERNET 權限。
  2. 網路請求放入子線程或使用成熟庫。
  3. 設置連接/讀取超時,避免無限阻塞。
  4. 處理異常情況(弱網、404、圖片損壞),提供佔位圖。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved