Дождитесь окончания функции - PullRequest
0 голосов
/ 25 августа 2018

У меня есть этот код:

function getLocation() {
  //function executed if started by webview
  if (typeof Jinterface != 'undefined') {
    Jinterface.displayGPSRequest();
  }

  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(showPosition, showError, {
      enableHighAccuracy: true
    });
  } else {
    alert("Geolocation is not supported by this browser.");
  }
}

Мне нужен JavaScript, чтобы дождаться завершения функции Jinterface.displayGPSRequest(), прежде чем продолжить работу с кодом. Я пробовал async / await, но, будучи функцией, вызываемой из файла Java в Android Studio (где у меня есть веб-просмотр моего сайта), я не могу назвать его с помощью оператора async, потому что Java не распознает Это. Любая помощь?

Функция Java:

 @JavascriptInterface
    public void displayGPSRequest() {
        Context context = getApplicationContext();
        GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context)
                .addApi(LocationServices.API).build();
        googleApiClient.connect();
        final String TAG = "YOUR-TAG-NAME";
        final int REQUEST_CHECK_SETTINGS = 0x1;

        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(10000);
        locationRequest.setFastestInterval(10000 / 2);

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
        builder.setAlwaysShow(true);

        PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(LocationSettingsResult result) {
                final Status status = result.getStatus();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        Log.i(TAG, "All location settings are satisfied.");
                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to upgrade location settings ");

                        try {
                            // Show the dialog by calling startResolutionForResult(), and check the result
                            // in onActivityResult().
                            status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
                        } catch (IntentSender.SendIntentException e) {
                            Log.i(TAG, "PendingIntent unable to execute request.");
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog not created.");
                        break;
                }
            }
        });
    }

1 Ответ

0 голосов
/ 25 августа 2018

displayGPSRequest необходимо будет предоставить способ узнать, когда он заканчивается.Если это не так, вам нужно отредактировать его, чтобы добавить один (или использовать опрос, что не очень хорошая идея).

Обычные способы:

  1. Через обещание.

  2. Через необработанный обратный вызов.

Так что если displayGPSRequest возвращает обещание (или вы его редактируете)to):

JInterface.displayGPSRequest()
    .then(function() {
        // The code that should run when it finishes
    })
    .catch(function() {
        // It failed
    });

Если displayGPSRequest использует необработанный обратный вызов (или вы редактируете его), то:

JInterface.displayGPSRequest(function() {
    // The code that should run when it finishes
    // It should also have some way of telling the callback it failed
});

Если он не обеспечивает средства уведомления васкогда он заканчивается, и вы не можете добавить его, вам придется использовать опрос для какого-либо побочного эффекта, который он производит, что очень похоже на крайнюю ситуацию:

var timer = setInterval(function() {
    if (/*...the side effect is present and so you know it's done..*/) {
        clearInterval(timer);
        timer = 0;
        // The code that should run when it finishes
    }
}, 100); // 100ms = ten times a second, adjust as appropriate
setTimeout(function() {
    if (timer) {
        // Give up
        clearInterval(timer);
        timer = 0;
    }
}, 5000); // 5000ms = five seconds
...