繁体   English   中英

从Kotlin中的类更新UI的正确方法

[英]Proper way to update UI from a class in Kotlin

我是Android开发的新手,我想知道从另一个类更新UI的最佳实践是什么。

示例:当我进入活动时,我启动了一个函数myClass.PerformCalculation() ,该函数需要一些时间,当计算结束时,我想使用计算结果来更新UI。 这将产生以下错误:

CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

我正在考虑在活动中使用广播接收器,并在myClass.PerformCalculation()的末尾执行SendBroadcast ,这是一个好习惯吗?

这里是AsyncTask的文档。

它将帮助您执行一些后台任务,并在完成后将结果发布到主UI。

从文档中:

通过AsyncTask,可以正确,轻松地使用UI线程。 此类允许您执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

代码示例:来自Stack Answer

inner class someTask() : AsyncTask<Void, Void, String>() {
    override fun doInBackground(vararg params: Void?): String? {
        // ...
    }

    override fun onPreExecute() {
        super.onPreExecute()
        // ...
    }

    override fun onPostExecute(result: String?) {
        super.onPostExecute(result)
        // UPDATE UI HERE
    }
}

使用RxJava

object MyClass {
    fun performCalculation(): Single<Int> {
        return Single.fromCallable {
            //perform calculation
            1
        }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
    }
}

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        MyClass.performCalculation().subscribe { result ->
            //update ui
        }
    }
}

使用协程

object MyClass {
    fun performCalculation(): Deferred<Int> {
        return async(CommonPool) {
            //your calculation
            1
        }
    }
}

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        launch(UI) {
            val result = MyClass.performCalculation().await()
            //update ui
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM