Well, multithreaded programming has two challenges; wrap your head around the idea that things can happen asynchronously and then the actual code to deal with that. In my experience nobody can help you with the former, but Kotlin coroutines helps a lot with the latter