如何将数据从后台线程移动到ui线程

问题描述 投票:0回答:3

我是编程的初学者,并不了解很多。我使用谷歌路线图API来获取两个标记之间的距离。显然,它是在后台线程上执行的。我无法使用可运行的程序在ui上显示接收到的距离,但无法将距离保存到全局变量中以用于其他计算。

这是我的代码的样子:

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);
          }
        });
      }
    }

  }

}

不幸的是,在此方法之外,我的距离arraylist仍然为null。在我尝试将距离结果添加到数组列表的同一空间内,我无法在视图或Toast上显示结果。另外,当我将结果添加到我的arraylist时,如果我在此方法中检查arraylist的大小,则表明结果已添加。但是,如果我在此方法之外访问我的arraylist,则为null。但是我需要能够收集距离列表(注意,从for循环调用此方法)并将每个收集的距离添加到我的距离数组列表中,并在该方法之外执行计算以获得总距离。请帮我找到一种方法。并且,请您像该领域的初学者一样,为您提供尽可能简单或技术性的解释。

java android multithreading backgroundworker ui-thread
3个回答
0
投票

[如果您使用的是android,则可以查看Android注释。您可以通过简单地将其声明为@Background来创建背景方法,然后使用@UiThread批注在主线程中添加内容。

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

这是一个非常强大的学习工具。您只需要几个依赖项


0
投票

因此事实证明,这确实不是问题。值已保存。在调用calculateDirections方法之后,我只是太早检查了数组列表的大小]


0
投票

所以在calculateDistance()之后;我举杯去检查arraylist的大小。其0

© www.soinside.com 2019 - 2024. All rights reserved.