
RxJava 2.2.7 Update
Вышла минорная версия RxJava в рамках которой произошел багфикс и улучшение
doOnTerminate
Size: a a a
doOnTerminate
launch(Dispatchers.IO) {
val image = api.fetchImageAsync(url).await()
val blurred =withContext(Dispatchers.Default) {
image.blur()
}
withContext(Dispatchers.Main) {
displayImage(blurred)
}
}
api.fetchImageObservable(url)
.subscribeOn(Schedulers.io()
.observeOn(Schedulers.computation())
.map { blurImageSync(it) }
.observeOn(AndroidSchedulers.mainThread())
.subscribe { displayImage(it) }
./gradlew -Pandroid.enableJetifier=false canIDropJetifier
@JvmOverloads
.override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState
launch(Dispatchers.Main) {
log("A")
}
log("B")
}
true
если выполнение должно продолжиться на другом потоке. Большинство CoroutineDispatcher
возвращают true
. Но для Dispatchers.Main потока будет эффективнее исполнять код сразу же если запуск корутины происходит с Main потока.class SampleActivity : Activity() {
override fun onCreate(savedState: Bundle?) {
super.onCreate(savedState)
setContentView(R.layout.activity_leak)
button.setOnClickListener {
startAsyncWork()
}
}
private fun startAsyncWork() {
val work = Runnable {
SystemClock.sleep(20000)
}
Thread(work).start()
}
}
private static final String TAG = "MyClass";
// or
private static final String TAG =
MyClass.class.getSimpleName();
MyClass.class.getSimpleName()
всегда будет возвращать одно и тоже значение - "MyClass"
. Фактически в оптимизированном байткоде можно делать подмену выполнения метода на простую строку. Важно понимать что это не работает для случая getClass().getSimpleName()
, т.е. когда класс получается динамически.LOG_TAG
для ваших логов 🎉dependencies {
def work_version = 1.0.0
// Java
implementation
"android.arch.work:work-runtime:$work_version"
// Kotlin KTX + coroutines
implementation
"android.arch.work:work-runtime-ktx:$work_version"
}
class MyWorker(
ctx: Context,params: WorkerParameters
): Worker(ctx, params) {
override fun WorkerResult doWork() {
//do the work you want done in the background
return Result.success()
}
}
val constraints: Constraints = Constraints.Builder()
.setRequiresCharging(true)
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val myWork =
OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(constraints).build()
WorkManager.getInstance().enqueue(myWork)