我是一名从 Java 切换到 Kotlin 的 Android 开发人员,我计划使用协程来处理异步代码,因为它看起来非常有前途。
回到 Java,为了处理异步代码,我使用Executor该类在另一个线程中执行一段耗时的代码,远离 UI 线程。我AppExecutors在我的xxxRepository课程中注入了一个课程来管理一组Executor. 它看起来像这样:
public class AppExecutors
{
private static class DiskIOThreadExecutor implements Executor
{
private final Executor mDiskIO;
public DiskIOThreadExecutor()
{
mDiskIO = Executors.newSingleThreadExecutor();
}
@Override
public void execute(@NonNull Runnable command)
{
mDiskIO.execute(command);
}
}
private static class MainThreadExecutor implements Executor
{
private Handler mainThreadHandler = new Handler(Looper.getMainLooper());
@Override
public void execute(@NonNull Runnable command)
{
mainThreadHandler.post(command);
}
}
private static volatile AppExecutors INSTANCE; …Run Code Online (Sandbox Code Playgroud) 我在将 Kotlin Flows 和 async DiffUtil 放在一起时遇到了麻烦。
我的 RecyclerView.Adapter 中有这个函数,它在计算线程上计算一个 DiffUtil 并将更新分派到主线程上的 RecyclerView :
suspend fun updateDataset(newDataset: List<Item>) = withContext(Dispatchers.Default) {
val diff = DiffUtil.calculateDiff(object : DiffUtil.Callback()
{
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean
= dataset[oldItemPosition].conversation.id == newDataset[newItemPosition].conversation.id
override fun getOldListSize(): Int = dataset.size
override fun getNewListSize(): Int = newDataset.size
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean
= dataset[oldItemPosition] == newDataset[newItemPosition]
})
withContext(Dispatchers.Main) {
dataset = newDataset // <-- dataset is the Adapter's dataset
diff.dispatchUpdatesTo(this@ConversationsAdapter)
}
}
Run Code Online (Sandbox Code Playgroud)
我从我的 Fragment …
android kotlin android-recyclerview kotlin-coroutines android-diffutils