Android 使用Kotlin按顺序对操作进行排序

Android 使用Kotlin按顺序对操作进行排序,android,kotlin,kotlin-coroutines,Android,Kotlin,Kotlin Coroutines,我正在尝试按顺序排列一些同步和异步操作,或者同步它们 填充微调器的初始默认值 进行网络调用并为微调器获取更多值(在模型类中使用协程,如果有帮助,可以返回作业对象) 进行网络调用以获取用户数据(在模型类中使用协程,如果有帮助,可以返回作业对象) 根据用户部门设置微调器的选择 问题:在微调器(#2)有机会完全填充值之前,#3和#4可能首先执行,并产生结果,因此我有时会出现越界错误 寻找一个解决方案,最好没有嵌套/金字塔的厄运。我已经在模型层中有了协同程序,我是否也需要在UI层中有另一组协同程序?(听

我正在尝试按顺序排列一些同步和异步操作,或者同步它们

  • 填充微调器的初始默认值
  • 进行网络调用并为微调器获取更多值(在模型类中使用协程,如果有帮助,可以返回作业对象)
  • 进行网络调用以获取用户数据(在模型类中使用协程,如果有帮助,可以返回作业对象)
  • 根据用户部门设置微调器的选择
  • 问题:在微调器(#2)有机会完全填充值之前,#3和#4可能首先执行,并产生结果,因此我有时会出现越界错误

    寻找一个解决方案,最好没有嵌套/金字塔的厄运。我已经在模型层中有了协同程序,我是否也需要在UI层中有另一组协同程序?(听起来并不优雅)

    注意:

    以下所有块(1-4)都位于数据绑定块内,以防有人使用方法提出解决方案

    val binding = FormBinding.inflate(inflater, container, false).apply {
    
    
    // 1. Create adapter with a single initial value
    
    val depts = hashMapOf(-1L to "--None Selected--")
    ArrayAdapter(activity!!, android.R.layout.simple_spinner_item, ArrayList(depts.values)).also { adapter ->
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        spinner.adapter = adapter
    }
    
    //#2. Load more values into adapter (network call, uses coroutine)
    
    model.findAllDepartments({
        it?.let {
            (spinner.adapter as? ArrayAdapter<String>)?.addAll(it.values)
        }
        Log.d("TAG", "onCreateView: adapter loaded")
    })
    
     //3. Get User Profile data (network call, uses coroutine)
    
    arguments?.getLong("id")?.let {
        model.findById(it, {
            user = it
            Log.d("TAG", "onCreateView: ${spinner.count} ${it?.dept?.first}")
        })
    }
    
    //4. Set selection of the spinner
    
    user?.dept?.let {
        spinner.setSelection(it.first.toInt() + 1)
    }
    
    }
    
    val binding=FormBinding.充气(充气机、容器、假)。应用{
    //1.使用单个初始值创建适配器
    val depts=hashMapOf(-1L到”--未选择--)
    ArrayAdapter(activity!!,android.R.layout.simple\u微调器\u项,ArrayList(depts.values))。还有{adapter->
    adapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项)
    spinner.adapter=适配器
    }
    //#2.将更多值加载到适配器(网络调用,使用协同路由)
    model.findAllDepartments({
    是吗?让我来{
    (spinner.adapter作为?ArrayAdapter)?.addAll(it.values)
    }
    Log.d(“标记”,“onCreateView:已加载适配器”)
    })
    //3.获取用户配置文件数据(网络呼叫,使用协同路由)
    参数?.getLong(“id”)?.let{
    model.findById(it{
    用户=it
    Log.d(“标记”,“onCreateView:${spinner.count}${it?.dept?.first}”)
    })
    }
    //4.设置微调器的选择
    用户?.dept?.let{
    spinner.setSelection(it.first.toInt()+1)
    }
    }