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

Android 下載網路圖片:URL.getContent() 為 null 改用 InputStream 讀取

     編輯:程式設計綜合問答

問題現象

使用 URL.getContent() 下載 JPEG 圖片回傳 null,無法建立 Drawable。

根本原因

URL.getContent() 依賴 ContentHandler 機制,對圖片等二進位內容支援不穩定,常回傳 null。標準做法是直接讀取 InputStream。

正確下載方式

方案一:標準 Java IO (同步,需背景執行緒)


public static Drawable downloadDrawable(String urlString) throws IOException {
    URL url = new URL(urlString);
    try (InputStream is = url.openStream()) {
        return Drawable.createFromStream(is, "src");
    }
}

方案二:HttpURLConnection 完整控制


public static Drawable downloadDrawable(String urlString) throws IOException {
    HttpURLConnection conn = (HttpURLConnection) new URL(urlString).openConnection();
    conn.setConnectTimeout(10000);
    conn.setReadTimeout(10000);
    conn.setRequestMethod("GET");
    if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
        try (InputStream is = conn.getInputStream()) {
            return Drawable.createFromStream(is, "src");
        }
    }
    throw new IOException("HTTP " + conn.getResponseCode());
}

方案三:現代 OkHttp + 協程 (推薦生產環境)


// build.gradle
implementation "com.squareup.okhttp3:okhttp:4.11.0"

// 使用
suspend fun downloadDrawable(url: String): Drawable? = withContext(Dispatchers.IO) {
    val request = Request.Builder().url(url).build()
    OkHttpClient().newCall(request).execute().use { response ->
        if (!response.isSuccessful) return@use null
        response.body?.byteStream()?.let { Drawable.createFromStream(it, "src") }
    }
}

關鍵最佳實踐

  • 網路請求必須在背景執行緒:AsyncTask/Thread/Coroutine,嚴禁主執行緒。
  • 設定連線/讀取逾時:避免無限等待導致 ANR。
  • 使用連線池:OkHttpClient 內建連線池,重用 TCP 連線。
  • 圖片快取:Glide/Coil/Picasso 自動處理記憶體/磁碟快取、生命週期、佔位圖、錯誤重試。

生產環境建議:直接用圖片載入庫


// Glide
Glide.with(context).load(url).into(imageView);

// Coil (Kotlin 協程原生)
imageView.load(url) { crossfade(true) }

優勢:零樣板碼、自動快取、記憶體優化、支援 GIF/WebP、生命週期感知、錯誤佔位圖。

總結

URL.getContent() 不可靠,請改用 InputStream 直接讀取位元組流,生產環境直接整合 Glide/Coil 專業圖片載入庫。

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