IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 安卓开发:网络图片下载和显示 -> 正文阅读

[移动开发]安卓开发:网络图片下载和显示


前言

记录APP从无到有下载网络图片并做展示的方法:创建一个图片加载器负责下载和显示。


一、图片加载器

图片加载器的功能包括图片下载和图片的缓存。

缓存类的设计如下,使用LruCache类即可,缓存的最大值设定为为运行时内存的四分之一。关于LruCache的使用和原理可自行百度。

class ImageCache {
    lateinit var imageCache: LruCache<String, Bitmap>
    init {
        initCache()
    }
    private fun initCache() {
        val maxMemory = Runtime.getRuntime().maxMemory() / 1024
        val cacheSize = maxMemory / 4
        imageCache = object : LruCache<String, Bitmap>(cacheSize.toInt()) {
            override fun sizeOf(key: String?, value: Bitmap?): Int {
                return (value?.rowBytes?.times(value.height) ?: 0) / 1024
            }
        }
    }
    fun putImage(url: String, bitmap: Bitmap) {
        imageCache.put(url, bitmap)
    }
    fun getImage(url: String): Bitmap? {
        return imageCache.get(url)
    }
}

图片下载类的设计如下,包括发起任务、网络连接和图片显示,先上代码:

class ImageLoader {
    val imageCache = ImageCache()
    //Android禁止任何主线程网络连接行为
    val executeService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())
    val handler: Handler = Handler(Looper.getMainLooper())

//使用时调用该方法,触发网络下载之前可先在imageCache中查找,没有再下载以节约资源。
    fun showImage(url: String, imageView: ImageView) {
        var bitmap = imageCache.getImage(url)
        if (bitmap != null) {
            imageView.setImageBitmap(bitmap)
            return
        }
        imageView.tag = url
        executeService.submit {
            Log.d(TAG,"service submit")
            bitmap = downloadImage(url)
            if (bitmap == null) return@submit
            else if (imageView.tag == url) {
                updateImage(bitmap!!, imageView)
            }
            //下载完成后会将图片放到缓存中
            imageCache.putImage(url, bitmap!!)
        }
    }

//下载图片的方法:建立连接,获取输入流并进行解析
    private fun downloadImage(url: String): Bitmap? {
        val imageURL = URL(url)
        var bitmap: Bitmap? = null
        try {
            val connect = imageURL.openConnection() as HttpURLConnection
            bitmap = BitmapFactory.decodeStream(connect.inputStream)
            Log.d(TAG, "bitmap is empty: $bitmap")
            connect.disconnect()
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return bitmap
    }
    private fun updateImage(bitmap: Bitmap, imageView: ImageView) {
        handler.post {
            imageView.setImageBitmap(bitmap)
        }
    }

在MainActivity中进行实践:

class MainActivity : AppCompatActivity() {
    lateinit var image_1: ImageView
    lateinit var loadBtn: Button
    //这是我测试时使用的自己QQ空间的一张图片的路径,自己可以修改
    val path: String =
        "http://photonj.photo.store.qq.com/psc?/sa14V12nyLUU3BNRg8322f777c023ef37d07ee96b7f448d4636a14V13cSHUM24lcsx/A845Uywr4tMMRU*7oNCSQ4nLkHSs4ffNYPeOJiLIo2gfhNAnSQ2jNS1KmyxKWGCwK0u8HAn65FJKPuhvIVtY*PB0TOKpigiy6DqU0QkLyxw!/b&bo=OASgBQAAAAARN5k!&rf=viewer_4"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        image_1 = findViewById(R.id.image_1)
        loadBtn = findViewById(R.id.btn_load)
        loadBtn.setOnClickListener {
            ImageLoader().showImage(path, image_1)
        }
    }

此时编译和运行代码可能会爆出以下错误:
第一个:

java.io.IOException: Cleartext HTTP traffic to XXXXXX not permitted

解决方法:申请网络权限,在AndroidMenifest中添加:
uses-permission android:name="android.permission.INTERNET
android:usesCleartextTraffic=“true”
样式如下:

<manifest
           ……省略
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
          ……省略
        android:usesCleartextTraffic="true">
        ……省略
    </application>
</manifest>

第二个:

java.net.UnknownHostException: Unable to resolve host "photonj.photo.store.qq.com": No address associated with hostname

解决方法:保证手机联网

最终,下载的图片会显示在ImageView中

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-04 13:32:50  更:2022-01-04 13:33:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:40:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码