Skip to content

Commit a180ff7

Browse files
qwwdfsadelizarov
authored andcommitted
Add name parameter to Handler.asCoroutineDispatcher
Fixes #580
1 parent a57d0c3 commit a180ff7

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

binary-compatibility-validator/reference-public-api/kotlinx-coroutines-android.txt

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public abstract class kotlinx/coroutines/experimental/android/HandlerDispatcher
3030
public final class kotlinx/coroutines/experimental/android/HandlerDispatcherKt {
3131
public static final fun awaitFrame (Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
3232
public static final fun from (Landroid/os/Handler;)Lkotlinx/coroutines/experimental/android/HandlerDispatcher;
33+
public static final fun from (Landroid/os/Handler;Ljava/lang/String;)Lkotlinx/coroutines/experimental/android/HandlerDispatcher;
34+
public static synthetic fun from$default (Landroid/os/Handler;Ljava/lang/String;ILjava/lang/Object;)Lkotlinx/coroutines/experimental/android/HandlerDispatcher;
3335
public static final fun getMain (Lkotlinx/coroutines/experimental/Dispatchers;)Lkotlinx/coroutines/experimental/android/HandlerDispatcher;
3436
}
3537

ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt

+11-4
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,13 @@ public sealed class HandlerDispatcher : CoroutineDispatcher(), Delay {
3737
}
3838

3939
/**
40-
* Represents an arbitrary [Handler] as a implementation of [CoroutineDispatcher].
40+
* Represents an arbitrary [Handler] as a implementation of [CoroutineDispatcher]
41+
* with an optional [name] for nicer debugging
4142
*/
4243
@JvmName("from") // this is for a nice Java API, see issue #255
43-
public fun Handler.asCoroutineDispatcher(): HandlerDispatcher =
44-
HandlerContext(this)
44+
@JvmOverloads
45+
public fun Handler.asCoroutineDispatcher(name: String? = null): HandlerDispatcher =
46+
HandlerContext(this, name)
4547

4648
private const val MAX_DELAY = Long.MAX_VALUE / 2 // cannot delay for too long on Android
4749

@@ -139,7 +141,12 @@ public class HandlerContext private constructor(
139141
public suspend fun awaitFrame(): Long =
140142
kotlinx.coroutines.experimental.android.awaitFrame()
141143

142-
override fun toString() = name ?: handler.toString()
144+
override fun toString(): String =
145+
if (name != null) {
146+
if (invokeImmediately) "$name [immediate]" else name
147+
} else {
148+
handler.toString()
149+
}
143150

144151
override fun equals(other: Any?): Boolean = other is HandlerContext && other.handler === handler
145152
override fun hashCode(): Int = System.identityHashCode(handler)

ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt

+9
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,15 @@ class HandlerDispatcherTest : TestBase() {
118118
job.join(mainLooper)
119119
}
120120

121+
@Test
122+
fun testToString() {
123+
ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 28)
124+
val main = Looper.getMainLooper().asHandler(async = true).asCoroutineDispatcher("testName")
125+
assertEquals("testName", main.toString())
126+
assertEquals("testName [immediate]", main.immediate.toString())
127+
assertEquals("testName [immediate]", main.immediate.immediate.toString())
128+
}
129+
121130
private suspend fun Job.join(mainLooper: ShadowLooper) {
122131
expect(1)
123132
mainLooper.unPause()

0 commit comments

Comments
 (0)