Skip to content

Commit

Permalink
Refactor TaskSchedule to support schedule handler
Browse files Browse the repository at this point in the history
  • Loading branch information
yongce committed Oct 7, 2020
1 parent 624aaab commit 461ac72
Show file tree
Hide file tree
Showing 8 changed files with 315 additions and 284 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,31 +10,21 @@ import java.util.concurrent.TimeUnit
import org.junit.Test

@LargeTest
class HandlerExecutorTest {
class HandlerTaskExecutorTest {
@Test
@Throws(InterruptedException::class)
fun checkLooper() {
println("test thread id=" + Thread.currentThread().id)
val executor = HandlerExecutor(Looper.getMainLooper())
val executor = HandlerTaskExecutor.withMainLooper()
val latch = CountDownLatch(4)
executor.postTasks(createTasks(latch, 4, 150))
createTasks(latch, 4, 150).forEach {
executor.postTask(it)
}
latch.await(1, TimeUnit.SECONDS)
assertThat(latch.count).isEqualTo(0L)
}

@Test
@Throws(InterruptedException::class)
fun clearTasks() {
val executor = HandlerExecutor(Looper.getMainLooper())
val latch = CountDownLatch(5)
executor.postTasks(createTasks(latch, 5, 100))
SystemClock.sleep(250)
executor.clearTasks()
latch.await(1, TimeUnit.SECONDS)
assertThat(latch.count).isGreaterThan(1L)
assertThat(latch.count).isLessThan(5L)
}

@Suppress("SameParameterValue")
private fun createTasks(latch: CountDownLatch, count: Int, sleepMs: Long): List<Runnable> {
val tasks = ArrayList<Runnable>(count)
for (i in 0 until count) {
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package me.ycdev.android.lib.common.annotation

/**
* Denotes that the annotated method can only be executed in the specified handler.
*/
@Target(
AnnotationTarget.FUNCTION,
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER
)
@Retention(AnnotationRetention.SOURCE)
annotation class HandlerWork(val value: String)

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package me.ycdev.android.lib.common.async

import android.os.Handler
import android.os.HandlerThread
import android.os.Looper
import androidx.annotation.NonNull

open class HandlerTaskExecutor(@NonNull val taskHandler: Handler) : ITaskExecutor {

override fun postTask(task: Runnable) {
taskHandler.post(task)
}

companion object {
fun withMainLooper(): HandlerTaskExecutor {
return HandlerTaskExecutor(Handler(Looper.getMainLooper()))
}

fun withHandlerThread(name: String): HandlerTaskExecutor {
val thread = HandlerThread(name)
thread.start()
return HandlerTaskExecutor(Handler(thread.looper))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,7 @@ interface ITaskExecutor {
/**
* Post a task to execute.
*
*
* This method should return immediately and the task should be executed asynchronously.
*/
fun postTasks(tasks: List<Runnable>)

/**
* Clear all pending tasks.
*/
fun clearTasks()
fun postTask(task: Runnable)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package me.ycdev.android.lib.common.async

import android.os.SystemClock
import me.ycdev.android.lib.common.utils.DateTimeUtils
import java.lang.StringBuilder
import java.util.concurrent.atomic.AtomicInteger

internal class TaskInfo(val executor: ITaskExecutor, val task: Runnable, val delay: Long, val period: Long = -1) {
private val taskId: Int = taskIdGenerator.incrementAndGet()
var triggerAt: Long = SystemClock.elapsedRealtime() + delay

override fun toString(): String {
val timestamp = System.currentTimeMillis() - (SystemClock.elapsedRealtime() - triggerAt)
return StringBuilder().append("TaskInfo[id=").append(taskId)
.append(", delay=").append(delay)
.append(", triggerAt=").append(DateTimeUtils.getReadableTimeStamp(timestamp))
.append(", period=").append(period)
.append(']')
.toString()
}

companion object {
private val taskIdGenerator = AtomicInteger(0)
}
}
Loading

0 comments on commit 461ac72

Please sign in to comment.