近段时间的学习碎片整理(33)

文章介绍了如何在Android中从assets目录读取压缩文件,将其保存到缓存文件夹并进行解压操作的函数实现,以及解决了EditText在调用软键盘搜索时搜索事件执行两次的问题,提出了解决方案,即通过判断ACTION_DOWN避免重复执行。
摘要由CSDN通过智能技术生成

一、从assets读取压缩文件保存到缓存文件夹并解压

  1. 最近有如上标题需求,简单研究了一下并实现,直接上代码

首先是从assets读取文件流保存到文件夹

  fun streamToFile(inputStream: InputStream, target: File): Boolean {
        val fileOutputStream = FileOutputStream(target)
        return try {
            val buffer = ByteArray(4096)
            var byteRead: Int
            while (inputStream.read(buffer).also { byteRead = it } != -1) {
                fileOutputStream.write(buffer, 0, byteRead)
            }
            true
        }catch (e: Throwable) {
            e.printStackTrace()
            false
        }finally {
            inputStream.close()
            fileOutputStream.flush()
            fileOutputStream.close()
        }
    }

接下来是解压文件的操作

 fun unZipFile(source: File, target: File): Boolean {
        if (!source.exists() || !source.canRead()) {
            return false
        }
        try {
            val zipFile = ZipFile(source)
            val zipInputStream = ZipInputStream(FileInputStream(source))
            var zipEntry: ZipEntry?
            while (zipInputStream.nextEntry.also { zipEntry = it } != null) {
                val fileName = zipEntry!!.name
                if (fileName != null && fileName.contains(MAC_IGNORE)) {
                    continue
                }
                val temp = File(target, fileName)
                if (zipEntry!!.isDirectory) {
                    val dir = File(target, fileName)
                    dir.mkdirs()
                    continue
                }
                if (temp.parentFile != null && (temp.parentFile?.exists() == false)) {
                    temp.parentFile!!.mkdirs()
                }
                val buffer = ByteArray(4096)
                val os = FileOutputStream(temp)
                // 通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流
                val inputStream = zipFile.getInputStream(zipEntry)
                var len: Int
                while (inputStream.read(buffer).also { len = it } != -1) {
                    os.write(buffer, 0, len)
                }
                os.close()
                inputStream.close()
            }
            zipInputStream.close()
            return true
        }catch (e: Throwable) {
            e.printStackTrace()
            return false
        }
    }

这样,就可以从assets将压缩文件放到缓存文件夹使用啦

二、问题记录:EditText调用软键盘搜索的setOnKeyListener方法事件执行两次

  1. 偶然发现项目中的上的搜索,在点击软键盘上的搜索按钮之后执行了两次

关于这个问题的解决,参考博客https://blog.csdn.net/m0_37700275/article/details/76944153

导致这个问题的出现其实是因为down和up执行,都会执行这个回调,导致搜索事件执行了两次,我采用了第一个方案,在判断条件上增加了对event.getAction() == KeyEvent.ACTION_DOWN的判断,问题得到解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值