Как сделать что-то в MainActivity после выполнения AsyncTask onPostExecute - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь получить LatLngs, чтобы найти ближайшее место в результатах поиска, я пытаюсь сделать это таким образом, но getLatLngs возвращает ноль, потому что он еще не инициализирован. Как я могу получить доступ к материалам из MainActivity после onPostExecute сделано. Заранее спасибо.

    public class GetNearbyPlaces extends AsyncTask<Object, String, String> {

    private ArrayList<LatLng> LatLngs = new ArrayList<>();
    private LatLng latLngMain;
    private LatLng shortestLatLng;


    @Override
    protected void onPostExecute(String s) {
        List<HashMap<String, String>> nearbyPlacesList = null;
        DataParser dataParser = new DataParser();
        nearbyPlacesList = dataParser.parse(s);

        shortestLatLng = DisplayNearbyPlaces(nearbyPlacesList);
    }

    private LatLng DisplayNearbyPlaces(List<HashMap<String, String>> nearbyPlacesList)
    {
        int index = 0;
        LatLng shortest;
        double shortestDistance = Double.MAX_VALUE;
        for(int i = 0;i<nearbyPlacesList.size();i++)
        {
            MarkerOptions markerOptions = new MarkerOptions();

            HashMap<String, String> googleNearbyPlace = nearbyPlacesList.get(i);
            String nameOfPlace = googleNearbyPlace.get("place_name");
            String vicinity = googleNearbyPlace.get("vicinity");
            double lat = Double.parseDouble(googleNearbyPlace.get("lat"));
            double lng = Double.parseDouble(googleNearbyPlace.get("lng"));


            LatLng latLng = new LatLng(lat,lng);
            LatLngs.add(latLng);

            markerOptions.position(latLng);
            markerOptions.title(nameOfPlace + " : " + vicinity);
            markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));

            if(mMap!=null)
                mMap.addMarker(markerOptions);

        }

        for(int i = 0;i<LatLngs.size();i++)
        {
            double deltaLat = latLngMain.latitude - LatLngs.get(i).latitude;
            double deltaLng = latLngMain.longitude - LatLngs.get(i).longitude;
            double distanceInDegree = Math.sqrt(deltaLat * deltaLat + deltaLng * deltaLng);
            double distanceInMeter = distanceInDegree * 4000;
            if(distanceInMeter<shortestDistance)
            {
                shortestDistance=distanceInMeter;
                index = i;
            }
        }

        shortest = LatLngs.get(index);

        return shortest;
    }

    public LatLng getShortestLatLng()
    {
        return shortestLatLng;
    }

}

В MainActivity

getNearbyPlaces.execute(transferData).get();
nearestDistance = getNearbyPlaces.getShortestLatLng();

1 Ответ

0 голосов
/ 16 января 2020

Вы должны инициализировать свое поле LatLngs перед вызовом для него методов.

Заменить

private ArrayList<LatLng> LatLngs;

на

private ArrayList<LatLng> LatLngs = new ArrayList<>();

В вашем коде вы инициализируете его только в l oop метода DisplayNearbyPlaces, и если, например, поблизостиPlacesList пусто, тело этого l oop не запускается и поле остается неинициализированным.

...