【问题标题】:How to run a function/method after onother finishes fethcing data in Android如何在另一个完成在 Android 中获取数据后运行一个函数/方法
【发布时间】:2019-11-04 16:18:22
【问题描述】:

我有一个 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();
    }

}

变量 country 和 city 被填充后,我想用这个已经有效的功能在谷歌地图上设置标记:

        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() 完成并填充变量国家和城市之后,应该调用设置标记的函数。

【问题讨论】:

  • 看来你没有使用AsyncTask你可以在getLocality之后调用getChargersFromDatabase
  • 谢谢,但我该怎么做呢?
  • 能否提供完整的课程,让我看看
  • 我想我找到了!

标签: android android-asynctask google-cloud-firestore task


【解决方案1】:

我想我已经使用 @Swayangjit 提到的 AsyncTask 解决了它。我使用了这段代码:

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

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    相关资源
    最近更新 更多