小编Cha*_*fon的帖子

Kotlin 的 Coroutines 与 Android 中的 Java Executor 有何不同?

我是一名从 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)

java android coroutine kotlin kotlin-coroutines

19
推荐指数
2
解决办法
7753
查看次数

协程、异步 DiffUtil 和不一致检测错误

我在将 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

4
推荐指数
1
解决办法
1216
查看次数