当前位置: 首页 > 知识库问答 >
问题:

从RxJava链中设置变量

莫翰藻
2023-03-14

我正在使用ReactiveLocation库。基本上,我想在4秒内获得一个足够准确的位置。如果在此期间未收到足够精度的位置,但其他位置已返回最高精度的位置。

一旦接收到足够准确的位置,则返回该位置并完成可观测。

我会发布我正在尝试的代码。我可能,也可能,以错误的方式进行。

LocationRequest request = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setFastestInterval(FASTEST_UPDATE_INTERVAL)
            .setSmallestDisplacement(MIN_DISTANCE_UPDATE_INTERVAL);

    if ( expirationSeconds != null )
        request.setExpirationDuration(TimeUnit.SECONDS.toMillis(expirationSeconds));

    ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(context);
    Observable<Location> observable = locationProvider.getUpdatedLocation(request)
                .doOnNext(new Action1<Location>() {
                    @Override
                    public void call(Location location) {
                        if ( mostAccurateLocation == null )
                            mostAccurateLocation = location;

                        if ( location.getAccuracy() < mostAccurateLocation.getAccuracy() )
                            mostAccurateLocation = location;
                    }
                })
                .filter(new Func1<Location, Boolean>() {
                    @Override
                    public Boolean call(Location location) {
                        return location.getAccuracy() < sufficientAccuracy ;
                    }
                });

    if ( expirationSeconds != null )
        observable = observable.timeout( expirationSeconds, TimeUnit.SECONDS, Observable.just(mostAccurateLocation), backgroundThread );

    return observable.firstOrDefault(mostAccurateLocation)
                     .doOnNext(new Action1<Location>() {
                        @Override
                        public void call(Location location) {
                            lastLocation = location;
                        }
                    });

共有1个答案

公冶高峯
2023-03-14

好的,我找到问题了。超时开始了,但很明显,超时启动的可观察对象使用了mostAccurateLocation变量,就像创建可观察对象时一样。

为了解决这个问题,我使用了可观察的。延迟模式,这样只会创建可观察的

    if ( expirationSeconds != null ) {
        Observable<Location> mostAccurateLocationObservable = Observable.defer(new Func0<Observable<Location>>() {
            @Override
            public Observable<Location> call() {
                return Observable.just(mostAccurateLocation);
            }
        });

        observable = observable.timeout( expirationSeconds, TimeUnit.SECONDS, mostAccurateLocationObservable, backgroundThread );
    }
 类似资料:
  • 我不确定使用不同的调度程序从rxJava链读/写实例变量的安全性。有一个小例子 为了简单起见,让我们假设这三个方法一个接一个地调用 我的问题:在io调度程序中设置变量,然后最近从计算调度程序或主线程中读取该变量是否安全? 我认为这不是线程安全的,但我希望一些rxJava和并发专家来证明这一点

  • 我想在启动脚本中设置环境变量(如),同时仍然能够仅用一个命令启动应用程序。

  • 本文向大家介绍rx-java 设置Retrofit和RxJava,包括了rx-java 设置Retrofit和RxJava的使用技巧和注意事项,需要的朋友参考一下 示例 Retrofit2带有对多种可插入执行机制的支持,其中一种是RxJava。 要与RxJava一起使用改造,首先需要将Retrofit RxJava适配器添加到您的项目中: 那么在构建改造实例时需要添加适配器: 在您定义API的界面

  • 我试图设置一个ENV等于Python脚本输出在我的dockerfile。由于分层,我无法找到将它们放在同一层的方法。我也无法找到一种方法将变量直接设置为等于脚本,我似乎无法找到如何在同一行中运行脚本。 python是一个简单的打印,称为test.py: 到目前为止,我已经在dockerfile中尝试了以下几个版本,以将ENV设置为脚本: 是否可以一步将ENV testvar设置为脚本的值,或者确保

  • 我正在Android上使用RxJava来执行登录操作。 我需要传入用户名、密码和布尔标志。用户名和密码并发送到服务器进行验证,一旦返回响应,我需要使用该标志来确定下一步要做什么。 由于登录操作是异步的,所以我希望确保当响应返回时,我仍然可以访问我在开始时传入的用户名、密码和标志。 以下是我认为存在问题的最初编码方式: 当我调用ecute1()时,它会返回一个可观察的,我将其缓存然后订阅。如果发生A

  • 问题内容: 这是我第一次使用SQLServer 2012,并且我收到的这段代码不起作用: 这段代码有问题: 我有以下三个错误: 问题答案: 您需要替换为,它将起作用 所以这 需要替换为