OS对异步回调函数栈的实现

go-routine
函数注册进去异步的闭包,该函数执行到分号或者下一行代码并不代表函数的调用栈不没有弹出,只是不分配cpu时间片给它。

OS的进程中有两个并列的函数调用栈?

好的,以下是实现该需求的 Kotlin 代码: Task.kt ```kotlin import android.os.Parcel import android.os.Parcelable // 定义请求类型枚举类 enum class RequestType { TYPE_1, TYPE_2, TYPE_3 } // 定义任务类 data class Task( val clientId: String, // 客户端 ID val requestType: RequestType, // 请求类型 val data: String // 请求数据 ) : Parcelable { constructor(parcel: Parcel) : this( parcel.readString()!!, RequestType.valueOf(parcel.readString()!!), parcel.readString()!! ) override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeString(clientId) parcel.writeString(requestType.name) parcel.writeString(data) } override fun describeContents(): Int { return 0 } companion object CREATOR : Parcelable.Creator<Task> { override fun createFromParcel(parcel: Parcel): Task { return Task(parcel) } override fun newArray(size: Int): Array<Task?> { return arrayOfNulls(size) } } } ``` TaskStack.kt ```kotlin import java.util.concurrent.ConcurrentLinkedQueue // 定义任务类 object TaskStack { private val stack = ConcurrentLinkedQueue<Task>() // 添加任务 fun addTask(task: Task) { stack.add(task) } // 取出任务 fun takeTask(): Task? { return stack.poll() } } ``` Dispatch.kt ```kotlin import java.util.concurrent.ExecutorService import java.util.concurrent.Executors import java.util.concurrent.LinkedBlockingQueue // 定义 Dispatch 类 class Dispatch { private val executorService: ExecutorService = Executors.newCachedThreadPool() private val callbacksMap = HashMap<String, (String) -> Unit>() // 注册回调函数 fun registerCallback(clientId: String, callback: (String) -> Unit) { callbacksMap[clientId] = callback } // 取消注册回调函数 fun unregisterCallback(clientId: String) { callbacksMap.remove(clientId) } // 开始处理任务 fun start() { executorService.execute { while (true) { val task = TaskStack.takeTask() if (task != null) { // 根据请求类型分发任务 when (task.requestType) { RequestType.TYPE_1 -> dispatchType1Task(task) RequestType.TYPE_2 -> dispatchType2Task(task) RequestType.TYPE_3 -> dispatchType3Task(task) } } } } } // 分发 TYPE_1 类型的任务 private fun dispatchType1Task(task: Task) { val callback = callbacksMap[task.clientId] if (callback != null) { // 异步处理任务 executorService.execute { // 处理任务 val result = "${task.data} processed by dispatch type 1" // 回调结果 callback(result) } } } // 分发 TYPE_2 类型的任务 private fun dispatchType2Task(task: Task) { val callback = callbacksMap[task.clientId] if (callback != null) { // 同步处理任务 val result = "${task.data} processed by dispatch type 2" // 回调结果 callback(result) } } // 分发 TYPE_3 类型的任务 private fun dispatchType3Task(task: Task) { val callback = callbacksMap[task.clientId] if (callback != null) { // 异步处理任务 executorService.execute { // 处理任务 val result = "${task.data} processed by dispatch type 3" // 回调结果 callback(result) } } } } ``` Service.kt ```kotlin import android.app.Service import android.content.Intent import android.os.* import java.util.concurrent.atomic.AtomicBoolean // 定义 Service 类 class MyService : Service() { private val binder = MyBinder() private val dispatch = Dispatch() private val isRunning = AtomicBoolean(false) // 定义 Binder 类 inner class MyBinder : Binder() { fun getService(): MyService { return this@MyService } } override fun onBind(intent: Intent): IBinder { return binder } override fun onCreate() { super.onCreate() // 开始处理任务 dispatch.start() isRunning.set(true) } override fun onDestroy() { super.onDestroy() isRunning.set(false) } // 处理来自客户端的任务请求 fun handleTaskRequest(task: Task) { // 添加任务到任务 TaskStack.addTask(task) // 注册回调函数 dispatch.registerCallback(task.clientId) { result -> // 回调结果给客户端 val messenger = task.messenger val message = Message.obtain() message.what = task.requestCode val bundle = Bundle() bundle.putString("result", result) message.data = bundle try { messenger.send(message) } catch (e: RemoteException) { e.printStackTrace() } } } } ``` 客户端使用时,需要先绑定服务,然后通过 Messenger 向服务端发送任务请求,服务端会处理任务并将结果回调给客户端。具体的实现可以参考官方文档:https://developer.android.com/guide/components/bound-services?hl=zh-cn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值