Как исправить "переменная, используемая в лямбда-выражении, должна быть окончательной"? - PullRequest
0 голосов
/ 11 января 2019

Я делаю приложение для Android и пытаюсь либо добавить маркер карты на карту, если это первый вызов API, либо просто изменить положение маркера. Я использую RxJava2 для повторных вызовов API. Проблема в том, что я не могу проверить, является ли это первым вызовом API, так как мне не разрешен доступ к не финальному логическому значению.

boolean firstReposition = true;
        //Create position call
        ISSPositionService service = ServiceGenerator.createService(ISSPositionService.class);

        //create observable
        Observable<ISSPositionData> issPositionCall = service.getPosition();

        Disposable disposable = issPositionCall.subscribeOn(Schedulers.io())
                .repeatWhen(completed -> completed.delay(30, java.util.concurrent.TimeUnit.SECONDS))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(positionData -> {
                    LatLng currentIssPosition = new LatLng(positionData.getIssPosition().getLatitude(), positionData.getIssPosition().getLongitude());
                    if (firstReposition) {
                        issMarkerOptions.position(currentIssPosition);
                        map.addMarker(issMarkerOptions);
                        firstReposition = false;
                    }
                    else {
                        issMarker.setPosition(currentIssPosition);
                    }

                    //animate camera so it shows current position
                    map.animateCamera(CameraUpdateFactory.newLatLng(currentIssPosition));
                });

Как бы я переписал код, чтобы я мог проверить и установить логическое значение?

1 Ответ

0 голосов
/ 11 января 2019

Используйте AtomicBoolean, вы можете использовать set() и get() методы java-docs

AtomicBoolean firstReposition = new AtomicBoolean(true);
    //Create position call
    ISSPositionService service = ServiceGenerator.createService(ISSPositionService.class);

    //create observable
    Observable<ISSPositionData> issPositionCall = service.getPosition();

    Disposable disposable = issPositionCall.subscribeOn(Schedulers.io())
            .repeatWhen(completed -> completed.delay(30, java.util.concurrent.TimeUnit.SECONDS))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(positionData -> {
                LatLng currentIssPosition = new LatLng(positionData.getIssPosition().getLatitude(), positionData.getIssPosition().getLongitude());
                if (firstReposition) {
                    issMarkerOptions.position(currentIssPosition);
                    map.addMarker(issMarkerOptions);
                    firstReposition.set(false);
                }
                else {
                    issMarker.setPosition(currentIssPosition);
                }

                //animate camera so it shows current position
                map.animateCamera(CameraUpdateFactory.newLatLng(currentIssPosition));
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...