Android 小知识点

1 在Android实现轮询功能(客户端定期向服务端发送请求以获取最新的数据技术)

原理:客户端按固定时间(5s,3m,1h)主动向服务器查询数据,适用于实时性要求不高的的场景(天气更新,聊天消息等)

实现方案:

RxJava方案:通过Observable.interval()创建定时任务‌。

Handler方案:结合postDelayed()实现延迟执行‌。

协程方案:使用delay()函数实现异步轮询‌(最优最推荐)

kotlin 复制代码
/**
 * 在Android开发中,使用kotlin协程实现轮询效果是当前推荐方案,其核心就是优势就是在于非阻塞式挂起和结构化并发管理
 */

class PollingViewModel : ViewModel() {

    private var pollingJob: Job? = null

    fun startPolling(interval: Long = 5000L) {
        pollingJob = viewModelScope.launch {
            while (isActive) {
                fetchData()//执行轮询任务
                delay(interval)
            }
        }
    }

    fun stopPolling() {
        pollingJob?.cancel()
    }

    private suspend fun fetchData() {
        withContext(Dispatchers.IO) {
            //轮询的逻辑  网络请求或数据库操作

        }
    }
}

然后在Activity中使用:

kotlin 复制代码
override fun onStart() {
    super.onStart()
    viewModel?.startPolling(3000)
}

override fun onStop() {
    super.onStop()
    viewModel?.stopPolling()
}

2 安卓开发中实现延迟操作调度常用方法:

方法2.1 Handler+postDelayed

优点:简单易用,适合短时间延迟任务。

在主线程运行,不用担心线程安全问题,

kotlin 复制代码
var handler = Handler(Looper.getMainLooper())
var runnable: Runnable = object : Runnable {
    override fun run() {
        handler.postDelayed(this, 1000)
    }
}
scss 复制代码
//开启延迟/定时任务
handler.postDelayed(runnable, 1000)
//停止定时任务
handler.removeCallbacks(runnable)

方法2.2 RxJava+Interval

使用RxJava的Observable.Interval或Observable.timer方法创建定时流适用于响应式编程场景,实时数据刷新,事件轮询。

Observable.interval(1, TimeUnit.SECONDS) // 每秒发射一次

.observeOn(Schedulers.io()) // 在后台线程执行

.subscribe(time -> {

Log.d("tyl","定时任务执行: " + time + "秒");

});

方法2.3 Kotlin Coroutine+delay

使用Kotlin的delay实现定时器,适用于安卓开发中轻量级异步定时任务。

优点:非阻塞,性能强,协程整合良好。

kotlin 复制代码
suspend fun doAction() {
    val job = lifecycleScope.launch{
        while (isActive){
            Log.d("tanyonglin", "Coroutine working...")
            delay(1000) //每秒执行一次
        }
    }
    delay(5000) //5s后取消任务
    job.cancelAndJoin()
}
相关推荐
恋猫de小郭17 小时前
iOS 26 开始强制 UIScene ,你的 Flutter 插件准备好迁移支持了吗?
android·前端·flutter
杨筱毅17 小时前
【底层机制】【Android】【面试】Zygote 为什么使用 Socket 而不是 Binder?
android·1024程序员节·底层机制
快乐10117 小时前
Media3 ExoPlayer扩展FFmpeg音视频解码
android
zgyhc205017 小时前
【Android Audio】安卓音频中Surround mode切换流程
android·音视频
gfdgd xi19 小时前
Wine运行器3.4.0——虚拟机安装工具支持设置UEFI启动
android·windows·python·ubuntu·架构
shaominjin12320 小时前
OpenCV 4.1.2 SDK 静态库作用与功能详解
android·c++·人工智能·opencv·计算机视觉·中间件
东坡肘子20 小时前
Swift 官方发布 Android SDK | 肘子的 Swift 周报 #0108
android·swiftui·swift
Storm-Shadow1 天前
Android OpenGLES视频剪辑示例源码
android·opengles·视频滤镜
双桥wow1 天前
android 堆栈打印
android
爱学习的大牛1231 天前
使用C++开发Android .so库的优势与实践指南
android·.so·1024程序员节