Skip to content

Commit d79207c

Browse files
committed
Added Duration support
1 parent a1cd73e commit d79207c

File tree

3 files changed

+64
-4
lines changed

3 files changed

+64
-4
lines changed

app/build.gradle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ android {
1111
versionCode 1
1212
versionName "1.0"
1313
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
14+
15+
kotlinOptions.freeCompilerArgs += [
16+
"-Xuse-experimental=kotlinx.coroutines.ExperimentalCoroutinesApi",
17+
"-Xuse-experimental=kotlinx.coroutines.ObsoleteCoroutinesApi",
18+
"-Xuse-experimental=kotlin.time.ExperimentalTime"]
1419
}
1520
buildTypes {
1621
release {
@@ -26,6 +31,7 @@ dependencies {
2631
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
2732
implementation "androidx.appcompat:appcompat:$appcompat"
2833
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
34+
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9'
2935

3036
testImplementation 'junit:junit:4.13.1'
3137
androidTestImplementation 'com.android.support.test:runner:1.0.2'

app/src/main/java/omega_r/com/extensions/simple/MainActivity.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,50 @@ package omega_r.com.extensions.simple
22

33
import androidx.appcompat.app.AppCompatActivity
44
import android.os.Bundle
5+
import android.util.Log
6+
import com.omega_r.libs.extensions.coroutines.launchDelayed
7+
import com.omega_r.libs.extensions.coroutines.launchWithTicker
8+
import kotlinx.coroutines.CoroutineScope
9+
import kotlinx.coroutines.Dispatchers
10+
import kotlin.time.DurationUnit
11+
import kotlin.time.seconds
512

613
class MainActivity : AppCompatActivity() {
714

815
override fun onCreate(savedInstanceState: Bundle?) {
916
super.onCreate(savedInstanceState)
1017
setContentView(R.layout.activity_main)
18+
19+
CoroutineScope(Dispatchers.Default).apply {
20+
launchDelayed(4900) {
21+
Log.d("MainActivity", "launchDelayed(4900)")
22+
}
23+
launchDelayed(5.seconds) {
24+
Log.d("MainActivity", "launchDelayed(5.seconds)")
25+
}
26+
launchWithTicker(
27+
ticksCount = 10,
28+
tickDurationMillis = 1000,
29+
initialDelayMillis = 5000,
30+
onTick = {
31+
Log.d("MainActivity", "launchWithTicker($it)")
32+
},
33+
onEnd = {
34+
Log.d("MainActivity", "launchWithTicker(end)")
35+
}
36+
)
37+
launchWithTicker(
38+
ticksCount = 10,
39+
tickDuration = 1.seconds,
40+
initialDelay = 15.seconds,
41+
onTick = {
42+
Log.d("MainActivity", "launchWithTicker2($it)")
43+
},
44+
onEnd = {
45+
Log.d("MainActivity", "launchWithTicker2(end)")
46+
}
47+
)
48+
}
1149
}
1250

1351
}

extensionslib/src/main/java/com/omega_r/libs/extensions/coroutines/CoroutinesExtensions.kt

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,46 @@ import kotlin.time.toDuration
1111

1212
fun CoroutineScope.launchWithTicker(
1313
ticksCount: Int,
14-
durationUnit: DurationUnit,
14+
tickDurationMillis: Long,
1515
onTick: suspend (Int) -> Unit,
1616
onEnd: (suspend () -> Unit)? = null,
1717
initialDelayMillis: Long = 0,
1818
): ReceiveChannel<Unit> {
1919
val tickerChannel = ticker(
20-
ticksCount.toDuration(durationUnit).toLongMilliseconds(),
20+
tickDurationMillis,
2121
initialDelayMillis
2222
)
2323
launch {
2424
var currentTick = 0
2525
for (event in tickerChannel) {
26-
if (currentTick >= ticksCount) {
26+
onTick(currentTick)
27+
if (currentTick == ticksCount) {
2728
onEnd?.invoke()
2829
tickerChannel.cancel()
2930
break
3031
}
31-
onTick(currentTick)
3232
currentTick++
3333
}
3434
}
3535
return tickerChannel
3636
}
3737

38+
fun CoroutineScope.launchWithTicker(
39+
ticksCount: Int,
40+
tickDuration: Duration,
41+
onTick: suspend (Int) -> Unit,
42+
onEnd: (suspend () -> Unit)? = null,
43+
initialDelay: Duration = Duration.ZERO,
44+
): ReceiveChannel<Unit> {
45+
return launchWithTicker(
46+
ticksCount = ticksCount,
47+
tickDurationMillis = tickDuration.toLongMilliseconds(),
48+
onTick = onTick,
49+
onEnd = onEnd,
50+
initialDelayMillis = initialDelay.toLongMilliseconds()
51+
)
52+
}
53+
3854
fun CoroutineScope.launchDelayed(delayMillis: Long, action: suspend () -> Unit) {
3955
launch {
4056
delay(delayMillis)

0 commit comments

Comments
 (0)