首页 > 解决方案 > 在 Kotlin 中避免竞态条件,Smartcast 是不可能的运行时异常

问题描述

该行:

viewAdapter.setTitleData(bezinningModels)

在下面的代码片段中给了我运行时警告:

智能转换为“BezinningAdapter”是不可能的,因为“viewAdapter”是一个可变属性,此时可能已更改

我浏览了很多带有类似运行时警告的帖子,我明白为什么会发生这种情况。基本上 Kotlin 想要避免竞争条件,以便可变对象的值不能改变,但我仍然没有得到我应该做的事情来避免这个错误,以便我可以将改造调用调用到RecyclerView Array 我试图从更改varval的价值RecyclerView但没有工作

这是导致问题的代码段:

@RequiresApi(Build.VERSION_CODES.HONEYCOMB)
class MainFragment : android.app.Fragment() {




private lateinit var viewManager: RecyclerView.LayoutManager
private lateinit var recyclerView: RecyclerView

private lateinit var viewAdapter: RecyclerView.Adapter<*>

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    val view = inflater!!.inflate(R.layout.bezinning_fragment, container, false)

   viewManager=LinearLayoutManager(activity)
    viewAdapter=BezinningAdapter()

    recyclerView = view.findViewById(R.id.recycler_view) as RecyclerView
    recyclerView.setHasFixedSize(true)
    recyclerView.layoutManager=viewManager
    recyclerView.adapter=viewAdapter


    val subscribe = bezinningListViewModel!!.showBezinningLijst("132")
            ?.subscribeOn(schedulerProvider!!.io())
            ?.observeOn(schedulerProvider!!.ui())
            ?.subscribe(object : FlowableSubscriber<List<BezinningModel>> {
                override fun onError(t: Throwable?) {
                    Log.d("IVO", "onError: ")
                }

                override fun onComplete() {
                    Log.d("IVO", "onComplete: ")
                }

                override fun onSubscribe(s: Subscription) {
                    s.request(Long.MAX_VALUE);

                }

                override fun onNext(bezinningModels: List<BezinningModel>?) 
   {

                    val JSONResponseBody = bezinningModels!! 
[0].attribute.body
                    viewAdapter.setTitleData(bezinningModels)


                    val bodyBezinningParsedHtml = 
Html.fromHtml(JSONResponseBody)



                }


            })

    return view

}



}

标签: androidkotlinandroid-recyclerview

解决方案


如果您知道这viewAdapter将是 a BezinningAdapter,那么将其声明为:

private lateinit var viewAdapter: BezinningAdapter<*>

推荐阅读