如何在Android中高效管理圖片加載
首先我們需要在配置AndroidManifest.xml里面添加
<uses-permission android:name="android.permission.INTERNET" />
在Android應用中實現(xiàn)圖片緩存和下載
在現(xiàn)代移動應用開發(fā)中,用戶體驗至關(guān)重要,特別是在圖像加載方面。為了提高應用的響應速度和減少網(wǎng)絡流量,我們通常采用緩存機制來存儲下載的圖片。本文將介紹如何在Android中實現(xiàn)一個簡單的圖片緩存加載器,允許從網(wǎng)絡下載圖片并緩存到本地。
項目結(jié)構(gòu)
我們將構(gòu)建一個名為 ImageCacheLoader
的類,該類負責從URL加載圖片,并首先檢查本地緩存。如果緩存不存在,則從網(wǎng)絡下載圖片。
使用
package com.example.dowhttppic; import android.os.Bundle; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import android.os.Bundle; import android.widget.ImageView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private ImageView imageView; private ImageCacheLoader imageCacheLoader; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); // 初始化 ImageCacheLoader imageCacheLoader = new ImageCacheLoader(this); // 加載圖片 String imageUrl = "圖片鏈接"; imageCacheLoader.loadImage(imageUrl, imageView); } }
代碼解析
package com.example.dowhttppic; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.widget.ImageView; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class ImageCacheLoader { private Context context; private Handler handler = new Handler(); // 用于處理UI線程更新 // 構(gòu)造函數(shù),接收上下文 public ImageCacheLoader(Context context) { this.context = context; } // 公共方法:加載圖片,首先從緩存讀取,如果沒有則通過網(wǎng)絡下載 public void loadImage(final String url, final ImageView imageView) { // 獲取緩存目錄 File cacheDir = context.getCacheDir(); String fileName = getFileNameFromUrl(url); final File imageFile = new File(cacheDir, fileName); // 如果本地有緩存,直接加載本地圖片 if (imageFile.exists()) { Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath()); imageView.setImageBitmap(bitmap); } else { // 啟動線程下載圖片并緩存 new Thread(new Runnable() { @Override public void run() { Bitmap bitmap = downloadImage(url); if (bitmap != null) { saveImageToCache(imageFile, bitmap); // 更新UI,需在主線程中執(zhí)行 handler.post(new Runnable() { @Override public void run() { imageView.setImageBitmap(bitmap); } }); } else { // 超時或下載失敗時顯示默認圖片 handler.post(new Runnable() { @Override public void run() { imageView.setImageResource(R.drawable.no_image_dow_http); } }); } } }).start(); } } // 從網(wǎng)絡下載圖片,添加超時機制 private Bitmap downloadImage(String urlString) { Bitmap bitmap = null; try { URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(5000); // 設置連接超時為5秒 connection.setReadTimeout(5000); // 設置讀取超時為5秒 connection.connect(); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream inputStream = connection.getInputStream(); bitmap = BitmapFactory.decodeStream(inputStream); inputStream.close(); } } catch (Exception e) { e.printStackTrace(); } return bitmap; } // 將下載的圖片保存到本地緩存 private void saveImageToCache(File imageFile, Bitmap bitmap) { try { OutputStream outputStream = new FileOutputStream(imageFile); bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); outputStream.flush(); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } // 根據(jù)URL提取文件名 private String getFileNameFromUrl(String url) { return url.substring(url.lastIndexOf("/") + 1); } }
關(guān)鍵功能解析
1. 圖片加載方法
loadImage
方法是該類的核心,它負責加載指定URL的圖片。首先,它嘗試從本地緩存讀取圖片,如果緩存存在,則直接使用緩存的圖片;如果不存在,則啟動一個新線程下載圖片。
public void loadImage(final String url, final ImageView imageView) { File cacheDir = context.getCacheDir(); String fileName = getFileNameFromUrl(url); final File imageFile = new File(cacheDir, fileName); if (imageFile.exists()) { Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath()); imageView.setImageBitmap(bitmap); } else { new Thread(new Runnable() { @Override public void run() { Bitmap bitmap = downloadImage(url); if (bitmap != null) { saveImageToCache(imageFile, bitmap); handler.post(new Runnable() { @Override public void run() { imageView.setImageBitmap(bitmap); } }); } else { handler.post(new Runnable() { @Override public void run() { imageView.setImageResource(R.drawable.no_image_dow_http); } }); } } }).start(); } }
2. 下載圖片
downloadImage
方法使用 HttpURLConnection
從給定URL下載圖片。它設置了連接和讀取的超時,以避免長時間等待。
private Bitmap downloadImage(String urlString) { Bitmap bitmap = null; try { URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); connection.connect(); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream inputStream = connection.getInputStream(); bitmap = BitmapFactory.decodeStream(inputStream); inputStream.close(); } } catch (Exception e) { e.printStackTrace(); } return bitmap; }
3. 保存圖片到緩存
saveImageToCache
方法將下載的圖片以PNG格式保存到應用的緩存目錄中。
private void saveImageToCache(File imageFile, Bitmap bitmap) { try { OutputStream outputStream = new FileOutputStream(imageFile); bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); outputStream.flush(); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } }
4. 文件名提取
getFileNameFromUrl
方法從圖片URL中提取文件名,以便在緩存中使用。
private String getFileNameFromUrl(String url) { return url.substring(url.lastIndexOf("/") + 1); }
或者通過學習glide
到此這篇關(guān)于在Android中高效管理圖片加載的文章就介紹到這了,更多相關(guān)Android圖片加載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 中clipToPadding 和 clipChildren區(qū)別和作用
這篇文章主要介紹了Android 中clipToPadding 和 clipChildren區(qū)別和作用的相關(guān)資料,需要的朋友可以參考下2017-06-06android之計時器(Chronometer)的使用以及常用的方法
在Android的SDK中,為我們提供了一個計時器,這個計時器稱為Chronometer,我們可以成它為Android的一個組件,同時它也具備自己獨有的方法2013-01-01android開發(fā)環(huán)境中SDK文件夾下的所需內(nèi)容詳解
在本篇文章里小編給大家整理的是關(guān)于android開發(fā)環(huán)境中SDK文件夾下的所需內(nèi)容詳解,有興趣的朋友們參考學習下。2019-09-09AndroidStudio利用android-support-multidex解決64k的各種異常
這篇文章主要為大家詳細介紹了AndroidStudio利用android-support-multidex解決64k的各種異常,感興趣的小伙伴們可以參考一下2016-09-09android listview實現(xiàn)新聞列表展示效果
這篇文章主要為大家詳細介紹了android listview實現(xiàn)新聞列表展示效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03