From e5866cb9eddb3127a6a182c0a03b22279e0c6460 Mon Sep 17 00:00:00 2001 From: Jarvis Lin Date: Mon, 10 Jun 2024 21:53:33 +0200 Subject: [PATCH] Make some refactors --- .../android/datasets/AsyncIoTaskExecutor.kt | 35 ------------- .../android/datasets/AsyncTaskExecutor.kt | 51 +++++++++++++++++++ .../ui/reader/adapters/ReaderPostAdapter.java | 7 +-- 3 files changed, 55 insertions(+), 38 deletions(-) delete mode 100644 WordPress/src/main/java/org/wordpress/android/datasets/AsyncIoTaskExecutor.kt create mode 100644 WordPress/src/main/java/org/wordpress/android/datasets/AsyncTaskExecutor.kt diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/AsyncIoTaskExecutor.kt b/WordPress/src/main/java/org/wordpress/android/datasets/AsyncIoTaskExecutor.kt deleted file mode 100644 index 8b3bd9f15403..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/datasets/AsyncIoTaskExecutor.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.wordpress.android.datasets - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext - -/** - * Helper class to handle asynchronous I/O tasks using coroutines - * @see Introduction - */ -object AsyncIoTaskExecutor { - /** - * Execute a data loading task in the IO thread and handle the result on the main thread - */ - @JvmStatic - fun execute(scope: CoroutineScope, backgroundTask: () -> T, callback: IoTaskResultCallback) { - scope.launch { - // handle the background task - val result = withContext(Dispatchers.IO) { - backgroundTask() - } - - withContext(Dispatchers.Main) { - // handle the result on the main thread - callback.onTaskFinished(result) - } - } - } - - interface IoTaskResultCallback { - fun onTaskFinished(result: T) - } -} - diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/AsyncTaskExecutor.kt b/WordPress/src/main/java/org/wordpress/android/datasets/AsyncTaskExecutor.kt new file mode 100644 index 000000000000..5b63e65e5b8e --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/datasets/AsyncTaskExecutor.kt @@ -0,0 +1,51 @@ +package org.wordpress.android.datasets + +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +/** + * Helper class to handle asynchronous I/O tasks using coroutines + * @see Introduction + */ +object AsyncTaskExecutor { + /** + * Execute a data loading task in the IO thread and handle the result on the main thread + */ + @JvmStatic + fun executeIo(scope: CoroutineScope, backgroundTask: () -> T, callback: AsyncTaskCallback) { + execute(scope, Dispatchers.IO, backgroundTask, callback) + } + + /** + * Execute a data loading task in the default thread and handle the result on the main thread + */ + @JvmStatic + fun executeDefault(scope: CoroutineScope, backgroundTask: () -> T, callback: AsyncTaskCallback) { + execute(scope, Dispatchers.Default, backgroundTask, callback) + } + + private fun execute( + scope: CoroutineScope, + dispatcher: CoroutineDispatcher, + backgroundTask: () -> T, + callback: AsyncTaskCallback + ) { + scope.launch(dispatcher) { + // handle the background task + val result = backgroundTask() + + withContext(Dispatchers.Main) { + // handle the result on the main thread + callback.onTaskFinished(result) + } + } + } + + interface AsyncTaskCallback { + fun onTaskFinished(result: T) + } +} + diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java index 68975cec5bf2..6dc4ad0d99d3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java @@ -21,7 +21,7 @@ import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.analytics.AnalyticsTracker; -import org.wordpress.android.datasets.AsyncIoTaskExecutor; +import org.wordpress.android.datasets.AsyncTaskExecutor; import org.wordpress.android.datasets.ReaderPostTable; import org.wordpress.android.datasets.ReaderTagTable; import org.wordpress.android.fluxc.store.AccountStore; @@ -83,12 +83,13 @@ import kotlin.jvm.functions.Function1; import kotlin.jvm.functions.Function2; import kotlin.jvm.functions.Function3; +import kotlinx.coroutines.CoroutineScope; public class ReaderPostAdapter extends RecyclerView.Adapter { private final ImageManager mImageManager; private final UiHelpers mUiHelpers; private final NetworkUtilsWrapper mNetworkUtilsWrapper; - private final LifecycleCoroutineScope mScope; + private final CoroutineScope mScope; private ReaderTag mCurrentTag; private long mCurrentBlogId; private long mCurrentFeedId; @@ -374,7 +375,7 @@ private void toggleFollowButton( return; } - AsyncIoTaskExecutor.execute( + AsyncTaskExecutor.executeIo( mScope, () -> !ReaderTagTable.isFollowedTagName(currentTag.getTagSlug()), isAskingToFollow -> {