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)
        }
    }