kotlin 代码使用AIDL 技术实现一个服务端可以接收来自多个不同的APP客户端的请求,要区分来自哪一个客户端app的什么类型请求,把请求加入任务栈,任务栈用一个单独的类TaskStack来管理,任务和注册的回调消息绑定。在一个子线程中while循环取出任务栈中的任务,有一个Dispach类来管理任务的分发,在Dispach类中按照请求的优先级同步或者异步的将任务分发执行,还需要考虑任务的优先级、同步或异步处理等问题,执行完成后通过Dispach把消息回调给发请求的那个客户端app,要求线程安全,给出详细的每一个类的代码
时间: 2024-03-27 14:39:55 浏览: 15
以下是一个使用 AIDL 技术实现的 Kotlin 服务端示例,可以接收来自多个不同的 APP 客户端的请求,同时区分来自哪一个客户端 APP 的什么类型请求,并将请求加入任务栈,使用一个单独的类 TaskStack 来管理,任务和注册的回调消息绑定,使用一个 Dispach 类来管理任务的分发,按照请求的优先级同步或者异步地将任务分发执行,并在执行完成后通过 Dispach 将消息回调给发起请求的那个客户端 APP。代码如下:
TaskStack.kt:
```kotlin
import java.util.concurrent.PriorityBlockingQueue
class TaskStack private constructor() {
private val tasks: PriorityBlockingQueue<Task> = PriorityBlockingQueue()
companion object {
private var instance: TaskStack? = null
@Synchronized
fun getInstance(): TaskStack {
if (instance == null) {
instance = TaskStack()
}
return instance as TaskStack
}
}
fun addTask(task: Task) {
tasks.offer(task)
}
fun getNextTask(): Task? {
return tasks.poll()
}
}
```
Task.kt:
```kotlin
import android.os.Parcel
import android.os.Parcelable
class Task(val appId: String, val type: String, val priority: Int, val data: String?, val callback: ITaskCallback?) : Parcelable, Comparable<Task> {
override fun compareTo(other: Task): Int {
return other.priority - priority
}
override fun describeContents(): Int {
return 0
}
override fun writeToParcel(dest: Parcel?, flags: Int) {
dest?.writeString(appId)
dest?.writeString(type)
dest?.writeInt(priority)
dest?.writeString(data)
dest?.writeStrongBinder(callback?.asBinder())
}
companion object {
@JvmField
val CREATOR = object : Parcelable.Creator<Task> {
override fun createFromParcel(source: Parcel): Task {
return Task(
source.readString() ?: "",
source.readString() ?: "",
source.readInt(),
source.readString(),
ITaskCallback.Stub.asInterface(source.readStrongBinder())
)
}
override fun newArray(size: Int): Array<Task?> {
return arrayOfNulls(size)
}
}
}
}
```
ITaskCallback.aidl:
```aidl
interface ITaskCallback {
void onTaskResult(String result);
}
```
Dispach.kt:
```kotlin
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
class Dispach private constructor() {
private var executorService: ExecutorService = Executors.newCachedThreadPool()
companion object {
private var instance: Dispach? = null
@Synchronized
fun getInstance(): Dispach {
if (instance == null) {
instance = Dispach()
}
return instance as Dispach
}
}
fun dispatch(task: Task) {
executorService.submit {
val result = doTask(task)
task.callback?.onTaskResult(result)
}
}
private fun doTask(task: Task): String {
// 执行任务的逻辑
return ""
}
}
```
TaskService.aidl:
```aidl
interface TaskService {
boolean registerCallback(ITaskCallback callback);
boolean unregisterCallback(ITaskCallback callback);
void addTask(Task task);
}
```
TaskServiceImpl.kt:
```kotlin
import android.os.RemoteCallbackList
import android.os.RemoteException
class TaskServiceImpl : TaskService.Stub() {
private val callbacks: RemoteCallbackList<ITaskCallback> = RemoteCallbackList()
private val taskStack: TaskStack = TaskStack.getInstance()
private val dispach: Dispach = Dispach.getInstance()
override fun registerCallback(callback: ITaskCallback): Boolean {
return callbacks.register(callback)
}
override fun unregisterCallback(callback: ITaskCallback): Boolean {
return callbacks.unregister(callback)
}
override fun addTask(task: Task) {
val result = taskStack.addTask(task)
if (result) {
while (true) {
val nextTask = taskStack.getNextTask() ?: break
dispach.dispatch(nextTask)
}
}
}
private fun notifyTaskResult(result: String, callback: ITaskCallback) {
try {
callback.onTaskResult(result)
} catch (e: RemoteException) {
callbacks.unregister(callback)
}
}
}
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![.zip](https://img-home.csdnimg.cn/images/20210720083646.png)
![.zip](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)