避免使用Thread.sleep,改用RxJava

4
我将这个方法应用于observable,但在调用此方法后,它会显示主线程上的过多工作。非常感谢你的帮助。
fun isBatteryHealthGood(): Observable<Boolean> {
        var count = 0
        intent = context.registerReceiver(broadCastReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))

    while (batteryStatus == null && count < maxCount) {
        Thread.sleep(1000)
        count++
    }
    return Observable.just(batteryStatus == BatteryManager.BATTERY_HEALTH_GOOD)
}

1
提供观察此方法的代码。 - Raj Suvariya
var status_ = disposable.add(batteryTestController.isBatteryHealthGood() .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe())。这是我编写的订阅代码。我将编辑上面的代码,使其可观察。对于错误,我感到抱歉。 - K.Dev
3个回答

2
我的解决方案是避免使用Thread.sleep(),而是使用间隔操作符。我认为你可以在isBatteryHealthGood()中省略observable。只需返回布尔值即可,像这样:
//a simple function works here, no need
fun isBatteryHealthGood(): Boolean {


    return batteryStatus == BatteryManager.BATTERY_HEALTH_GOOD
}

最后,像这样订阅:
Observable.
            interval(1000, TimeUnit.MILLISECONDS)
            take(maxCount) //place max count here
            .map { _ -> isBatteryHealthGood() }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.maintThread())
            .subscribe {
                batterystat ->
                //do what you need
            }

PS:您应该只注册接收器一次。
intent = context.registerReceiver(broadCastReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))

1
每秒注册一个接收器?这没有意义。 - arekolek
你说得对,注册这个接收器是另一个问题,我会更新我的答案。 - maheryhaja

1

1

你的代码存在多个问题。最好使用像 RxBroadcastReceiver 这样的库,这样你只需要编写以下代码:

fun isBatteryHealthGood(): Observable<Boolean> {
    return RxBroadcastReceivers
        .fromIntentFilter(context, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
        .map {
            it.getIntExtra(BatteryManager.EXTRA_HEALTH, 0) == BatteryManager.BATTERY_HEALTH_GOOD
        }
}

一个很大的好处是你不需要自己注册广播接收器,也不需要处理广播,这个逻辑包含在库中并通过可观察流进行路由。

所以没有必要使用Thread.sleepObservable.timer,这实际上违背了使用广播接收器的整个目的,因为广播接收器本应该向你“推送”更改而不是每秒“拉取”一次。

最后,当你dispose() isBatteryHealthGood()的结果时,它会自动为你取消注册广播接收器。


谢谢提供的信息。我会检查这个库。 - K.Dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接