android 新线程中的 Rx 函数
android Rx function in new thread
任务很简单 - 我需要在新线程中启动一些函数并在 UI 中显示结果。
这是我的代码
class FragmentKKMInfo {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
getKKMInfo().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ info ->
Log.i("RX", "LOG3")
//doUIStaff()
}, { error ->
Toast.makeText(context, error.message, Toast.LENGTH_LONG).show()
})
Log.i("RX", "LOG1")
}
private fun getKKMInfo(): Observable<KKMInfo> {
Thread.sleep(3000)
Log.i("RX", "LOG2")
//doSomeStaff()
return Observable.just(KKMInfo(
date,
shift_model_name,
shift_serial_number,
shift_state_string
))
}
}
我希望得到 LOG1、LOG2、LOG3。但是 Fragment 在整个代码完成之前不会显示,我的日志是 LOG2、LOG1、LOG3。
正确的做法是什么?
那是因为Thread.sleep(3000)
正在Main Thread
上执行。您正在执行 Thread.sleep(3000)
后创建 rx 流。您可以将 getKKMInfo 方法更改为以下内容以获得所需的结果:
private fun getKKMInfo(): Observable<KKMInfo> {
return Observable.fromCallable {
Thread.sleep(3000)
Log.i("RX", "LOG2")
//doSomeStaff()
return@fromCallable KKMInfo(
date,
shift_model_name,
shift_serial_number,
shift_state_string)
}
}
任务很简单 - 我需要在新线程中启动一些函数并在 UI 中显示结果。
这是我的代码
class FragmentKKMInfo {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
getKKMInfo().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ info ->
Log.i("RX", "LOG3")
//doUIStaff()
}, { error ->
Toast.makeText(context, error.message, Toast.LENGTH_LONG).show()
})
Log.i("RX", "LOG1")
}
private fun getKKMInfo(): Observable<KKMInfo> {
Thread.sleep(3000)
Log.i("RX", "LOG2")
//doSomeStaff()
return Observable.just(KKMInfo(
date,
shift_model_name,
shift_serial_number,
shift_state_string
))
}
}
我希望得到 LOG1、LOG2、LOG3。但是 Fragment 在整个代码完成之前不会显示,我的日志是 LOG2、LOG1、LOG3。
正确的做法是什么?
那是因为Thread.sleep(3000)
正在Main Thread
上执行。您正在执行 Thread.sleep(3000)
后创建 rx 流。您可以将 getKKMInfo 方法更改为以下内容以获得所需的结果:
private fun getKKMInfo(): Observable<KKMInfo> {
return Observable.fromCallable {
Thread.sleep(3000)
Log.i("RX", "LOG2")
//doSomeStaff()
return@fromCallable KKMInfo(
date,
shift_model_name,
shift_serial_number,
shift_state_string)
}
}