你可能需要了解下的Android开发技巧(一)

本篇文章将是介绍Android常见开发技巧系列的开篇,分享日常开发的一些技巧。

callbackFlow {}+debounce()降频

假如当前要做一个实时搜索的功能,监听输入框动态输入的内容向服务器发起搜索请求,这不仅会增大服务器的压力,而且也会产生很多的无用请求。

比如其实你想搜索一个“android”,但随着你在输入框中动态编辑,最多可能会向服务器发送7次请求,很明显前面6次请求都是属于无用请求(暂时不考虑模糊匹配的场景)。

这个时候我们就可以借助于callbackFlow{}将输入框的动态输入转换成流,再借助debounce()对流进行降频即可。关于对debounce()的讲解,可以参考之前的文章:debounce()限流

fun test4(editText: EditText) {
    lifecycleScope.launchWhenResumed {
        callbackFlow {
            val watcher = editText.doAfterTextChanged {
                trySend(it?.toString() ?: "")
            }

            invokeOnClose {
                editText.removeTextChangedListener(watcher)
            }
        }.debounce(200).collect {
            //对于输入框中的内容向服务器发起实时搜索请求

        }
    }
}

判断当前是否为主进程

常见的业务场景中,可能我们会把Service单独放一个进程处理,比如为了单独存放WebView再或者专门开一个服务进程与服务器进行通信,这样当UI进程死掉,也能缓存最新的数据到内容和本地 。

但有时,Service单独放一个进程处理,也会走Application的初始化逻辑,比如初始化第三方SDK、获取某些资源等等,但这些可能是只有UI进程才需要,所以Service进程初始化应该跳过这些逻辑。

所以我们需要判断当前的线程是否属于UI线程,可以利用UI进程的包名和进程名相同的特性实现,代码如下:

fun isMainProcess(): Boolean =
    getSystemService<ActivityManager>()?.let {
        it.runningAppProcesses.find { info ->
            info.pid == Process.myPid()
        }?.let { res ->
            res.processName == packageName
        }
    } ?: true

当我写完上面的代码之后,发现Application竟然直接提供了一个获取当前进程名称的方法:

不过这个只有SDK28以上才能使用,可以判断一下,SDK28以下用上面的代码判断,SDK28及以上用下面的代码判断:

fun isMainProcess2(): Boolean = packageName == getProcessName()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值