【问题标题】:How to make Android activity wait for completion of async process如何让 Android Activity 等待异步进程完成
【发布时间】:2017-07-09 08:13:39
【问题描述】:

使用RxAndroidBle 进行低功耗蓝牙连接。它可以扫描和识别具有给定服务 UUID 的设备(并将它们添加到向量中)。但是当我在 while 循环中添加一个自旋锁(实际上是一个 AtomicBoolean)来检测扫描何时完成时,它似乎不再找到设备。

public void scanForScopes() {
    Log.d( LOG_TAG, "Entered scanForScopes()" );
    rxBleDeviceVector.clear( );
    asDeviceVector.clear( );
    // since we added time and device count limits, we know this Observable will not run forever
    scanSubscriber = new AsScanSubscriber<>( ); 
    scanSubscription = asBleClient
            .scanBleDevices( asServiceIdArray )
            .subscribeOn( Schedulers.io() )
            .observeOn( AndroidSchedulers.mainThread( ) )
            .take( MAX_SCOPES )
            .take( SCAN_TIME, TimeUnit.SECONDS )
            .doOnNext( this::addRxBleScanResult ) // works
            .doOnCompleted( () -> Log.d( LOG_TAG, "Scan for scope devices has completed" ) ) // doesn't seem to be called
            .subscribe( scanSubscriber ); // calls scanSubscriber.onStart() (which sets nowScanning true)

我怀疑可能发生了几件事:

  1. 主 UI 线程已向前推进并尝试显示已发现设备的空向量。如果是这种情况,我怎样才能让它等待设备扫描完成而不会使系统陷入困境?我认为 RxJava 平台消除了AsyncTask 选项。
  2. 测试扫描完成的while() 循环可能会占用过多的CPU 周期,从而导致扫描无法成功。我怎样才能解决这个问题?

【问题讨论】:

  • 将代码保留在要在 asynctask 完成后执行的函数中。并在异步任务执行后调用它。
  • while 循环在哪里?你为什么要积极等待? Observable 将以异步方式运行,并在完成时触发事件

标签: android multithreading rx-java rx-android rxandroidble


【解决方案1】:

问题的解决方案是避免它,通过使用 scanSubscriber 的 onCompleted() 回调来继续程序的流程。

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 2014-04-03
    • 2023-03-16
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 2010-10-11
    • 2021-04-16
    相关资源
    最近更新 更多