代码之家  ›  专栏  ›  技术社区  ›  Sook Lim

我应该在哪里调用我的更新映射函数?我需要在异步任务之后调用它吗?

  •  0
  • Sook Lim  · 技术社区  · 6 年前

    大家好,我是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
    

    4月1日:

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

    更新映射

             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 回复  |  直到 6 年前
        1
  •  0
  •   Kishan Thakar    6 年前
    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);
    }
    
        2
  •  0
  •   Android Hupp Technologies    6 年前

    下面的代码片段非常适合我。请试一试。

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

    然后在mapready()方法上添加以下代码

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