Как запустить функцию / метод после завершения других данных в Android? - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть приложение GPS, в котором я выбираю положение пользователя, а затем извлекаю название города и страны, в котором он находится. Я использовал этот код, чтобы определить его:

    public void getLocality() {

    geocoder = new Geocoder(context);
    try {
        List<Address> addressList = geocoder.getFromLocation(lat, lng, 1);
        country = addressList.get(0).getCountryName();
        locality = addressList.get(0).getLocality();
        Log.wtf("Location is ", locality + " in " + country);

    } catch (IOException e) {
        e.printStackTrace();
    }

}

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

        public void getChargersFromDatabase() {

       db.collection("chargers")
         //      .whereEqualTo("country", country)
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            MarkerOptions chargers = new MarkerOptions();

                            for (QueryDocumentSnapshot document : task.getResult()) {
                                Log.d(TAG, document.getId() + " => " + document.getData());
                                GeoPoint charger = document.getGeoPoint("geopoint");

                                String name = document.getString("name");
                                String status = document.getString("status");

                                double lat = charger.getLatitude();
                                double lng = charger.getLongitude();
                                LatLng latLng = new LatLng(lat, lng);

                                if(status.equals("ready")) {
                                    chargers.icon(BitmapDescriptorFactory.fromResource(R.drawable.thundergreen));
                                    chargers.anchor(0.5f,0.5f);                          
                                }
                                if(status.equals("in use")) {
                                   chargers.icon(BitmapDescriptorFactory.fromResource(R.drawable.thunderred));
                                    chargers.anchor(0.5f,0.5f);
                                }

                                chargers.position(latLng);
                                chargers.title(name);

                                map.addMarker(chargers);
                        }
                    } else {
                           public void getChargersFromDatabase() {


        LatLngBounds curScreen = map.getProjection()
                .getVisibleRegion().latLngBounds;

        Log.wtf("LATLONG BOUNDS", curScreen.toString());

        Log.wtf("getChargers", "Function called");

       db.collection("chargers")
               .whereEqualTo("country", country)
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            MarkerOptions chargers = new MarkerOptions();

                            Log.wtf("getChargers", "Task completed");
                            Log.wtf("getChargers", country);

                            for (QueryDocumentSnapshot document : task.getResult()) {
                                Log.d(TAG, document.getId() + " => " + document.getData());
                                GeoPoint charger = document.getGeoPoint("geopoint");

                                String name = document.getString("name");
                                String status = document.getString("status");

                                Log.wtf("status", status);

                                double lat = charger.getLatitude();
                                double lng = charger.getLongitude();
                                LatLng latLng = new LatLng(lat, lng);

                                if(status.equals("ready")) {
                                    chargers.icon(BitmapDescriptorFactory.fromResource(R.drawable.thundergreen));
                                    chargers.anchor(0.5f,0.5f);
                                    Log.wtf("getChargers", "if it is ready");
                                }

                                if(status.equals("in use")) {
                                    chargers.icon(BitmapDescriptorFactory.fromResource(R.drawable.thunderred));
                                    chargers.anchor(0.5f,0.5f);
                                }

                                chargers.position(latLng);
                                chargers.title(name);

                                map.addMarker(chargers);
                        }
                    } else {
                        Log.d(TAG, "Error getting documents: ", task.getException());
                    }
                }
    });

  }
}

Как я могу убедиться, что после того, как getLocality () завершает работу и заполняет переменные countr и city, функциячтобы установить маркеры должны быть вызваны.

1 Ответ

1 голос
/ 04 ноября 2019

Я думаю, что решил это с помощью AsyncTask, как упомянуто @Swayangjit. Я использовал этот код:

private class getLocalityTask extends AsyncTask<Void, Void, String> {
    @Override
    protected String doInBackground(Void... voids) {

        getLocality();
        return country;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        getChargersFromDatabase();
    }
}
...