Где я должен вызвать функцию обновления карты? Мне нужно вызывать ее после выполнения моей асинхронной задачи? - PullRequest
0 голосов
/ 25 мая 2018

Привет, я новичок в программировании на Android, и у меня есть приложение, которое, когда пользователь нажимает на страну, запускает другое действие, отображая карту с маркером, определяющим местонахождение столицы.

Но мне нужно получитькапитал из моего метода асинхронной задачи. Так что он должен вернуть информацию о стране, а затем я могу обновить свою карту. Я вызвал метод обновления карты в onPost Execute, но приложение просто падает?

В моем при создании

 mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync( this);


    new GetCountryDetails().execute(selectedCountry);

Затем в моей асинхронной задаче

private class GetCountryDetails extends AsyncTask<String, String, CountryInfo> {

    @Override
    protected CountryInfo doInBackground(String... params) {
       CountryInfo countryInfo = null;

В моем onPostExecute

protected void onPostExecute(CountryInfo countryInfo) {
    countryCapital=countryInfo.getCapital();

    updateMap(map);//doesn't work here

onMapReady:

public void onMapReady(GoogleMap map) {
    map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    map.getUiSettings().setMapToolbarEnabled(true);

updateMap

         public void updateMap(GoogleMap map){
    LatLng capitalCity = getCityLatitude(this, countryCapital);
       map.moveCamera(CameraUpdateFactory.newLatLng(capitalCity));

        MarkerOptions marker = new MarkerOptions().position(capitalCity).title( countryCapital);
        map.addMarker(marker);

    }

Любая помощь будет оценена спасибо!

Я

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

приведенный ниже фрагмент кода отлично работает для меня.Пожалуйста, попробуйте.

private GoogleMap mMap;
ArrayList<LatLngBean> arrayList;
private ArrayList<LatLng> listLatLng;

добавить приведенный ниже код в метод onPostExecute

LatLngBean bean = new LatLngBean();
bean.setTitle(jobj.getString(""));
bean.setSnippet("Hello, " + jobj.getString(""));
bean.setLatitude(jobj.getString("latitude"));
bean.setLongitude(jobj.getString("longitude"));
arrayList.add(bean);
runOnUiThread(new Runnable() {
 @Override
  public void run() {
    mapFragment.getMapAsync(YourActivity.this);
  }
});

, а затем добавить указанный ниже метод onMapReady ()

 @Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    if (arrayList.size() > 0) {
        try {
            listLatLng = new ArrayList<>();
            for (int i = 0; i < arrayList.size(); i++) {
                final LatLngBean bean = arrayList.get(i);
                double lat = Double.parseDouble(bean.getLatitude());
                double lon = Double.parseDouble(bean.getLongitude());

                LatLng latLng = new LatLng(lat, lon);

                BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.salesman_map_icon);
                mMap.addMarker(new MarkerOptions()
                        .position(latLng)
                        .title(bean.getTitle())
                        .snippet(String.valueOf(i))
                        //.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)));
                        .icon(icon));
                mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
                mMap.animateCamera(CameraUpdateFactory.zoomTo(17));
                LatLng object = new LatLng(lat, lon);
                listLatLng.add(object);
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
    }
  }
0 голосов
/ 25 мая 2018
Create Map varible as activity field.And define variable in onMapReady function.After that use activity variable as you want. I think it should works.

GoogleMap map;

public void onMapReady(GoogleMap map) {

    this.map = map;
    map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    map.getUiSettings().setMapToolbarEnabled(true);
}
...