Как переместить данные из фонового потока в поток пользовательского интерфейса - PullRequest
0 голосов
/ 03 февраля 2020

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

Вот как выглядит мой код:

public class MyClass {

  private List<Distance> distances = new ArrayList<>();

  private void calculateDistance (LatLng origin, LatLng destination) {
    DirectionsApiRequest directions = new DirectionsApiRequest(mGeoApiContext);

    directions.origin(origin);
    directions.destination(destination).setCallback(new PendingResult.Callback<DirectionsResult>() {
      @Override
      public void onResult(DirectionsResult result) {
        Distance distance = result.routes[0].legs[0].distance;
        new Handler(Looper.getMainLooper()).post(new Runnable() {
          @Override
          public void run() {
          //adding the distance result from this method to the distances arraylist above
          distances.add(distance);
          }
        });
      }
    }

  }

}

К сожалению, мой массив расстояний остается нулевым вне этого метода. В том же пространстве, где я пытаюсь добавить результат расстояния для моего массива, я могу отобразить результат на виде или тосте. Кроме того, когда я добавляю результат в мой массив, если я проверяю размер списка в этом методе, он показывает, что результат был добавлен. Но если я получу доступ к своему архиву вне этого метода, он будет нулевым. Но мне нужно иметь возможность собрать список расстояний (NB. Этот метод вызывается из a для l oop) и добавить каждое собранное расстояние в мой массив расстояний и выполнить расчет вне метода, чтобы получить общее расстояние , Пожалуйста, помогите мне найти способ. И, пожалуйста, сделайте объяснения как можно более простыми или менее техническими, поскольку я новичок в этой области.

Ответы [ 3 ]

0 голосов
/ 03 февраля 2020

Так что получается, что проблема действительно не была. Значения были сохранены. Я только что проверил размер моего массива слишком рано после того, как метод calcDirections вызван

0 голосов
/ 03 февраля 2020

Итак, сразу после вычисленияDistance (); Я провожу тост, чтобы проверить размер массива. Его 0

Ну да.

calculateDistance не рассчитывает расстояние. Он отправляет запрос на сервер, чтобы попросить расстояние, и он делает заметку о том, что делать, когда ответ возвращается. Если вы отправите запрос, то напечатаете размер ArrayList, конечно, он равен 0, потому что ответ еще не вернулся.

Когда ответ возвращается, тогда onResult метод выполняется.

0 голосов
/ 03 февраля 2020

Если вы работаете с android, вы можете посмотреть Android Аннотации. Вы можете создать фоновые методы, просто объявив их @Background, а затем разместите материал в главном потоке с аннотацией @UiThread.

https://developer.android.com/studio/write/annotations

Это очень мощный инструмент для изучения. Все, что вам нужно, это пара зависимостей

...