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

Android 從網路載入圖片失敗?改用 Drawable.createFromStream 更穩定

     編輯:程式設計綜合問答

錯誤現象

使用 HttpURLConnection + BitmapFactory.decodeStream() 從 URL 下載圖片,Toast 總顯示 "Image can't load",但網址在瀏覽器正常開啟。

原因分析

  • 部分伺服器回應 Content-Encoding: gzip,getInputStream() 回傳壓縮資料流,BitmapFactory 無法直接解碼
  • 網路連線逾時、重導向處理不當皆可能導致 IOException
  • 主執行緒執行網路請求會拋出 NetworkOnMainThreadException (API 11+)

簡易修正:使用 Drawable.createFromStream

public Drawable getDrawableFromUrl(String urlString) {
    try {
        InputStream is = (InputStream) new URL(urlString).getContent(); // 自動處理 gzip
        return Drawable.createFromStream(is, "src");
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

// 呼叫端 (需在背景執行緒)
new Thread(() -> {
    Drawable d = getDrawableFromUrl("https://example.com/image.gif");
    runOnUiThread(() -> {
        if (d != null) imageView.setImageDrawable(d);
        else Toast.makeText(this, "載入失敗", Toast.LENGTH_SHORT).show();
    });
}).start();

生產環境建議

實務專案請直接採用成熟圖片載入框架:

  • Glide:Glide.with(this).load(url).into(imageView);
  • Picasso:Picasso.get().load(url).into(imageView);
  • Coil (Kotlin):imageView.load(url)

框架內建快取、生命週期感知、錯誤重試、佔位圖等功能,避免重複造輪子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved