如何先显示地图然后下载图像标记?

Posted

技术标签:

【中文标题】如何先显示地图然后下载图像标记?【英文标题】:How to show maps first and then download image markers? 【发布时间】:2018-05-17 12:58:03 【问题描述】:

我正在尝试显示custom marker with images 这里的图片是从互联网下载的。

一切都很好,得到了预期的结果。

这是输出图像

但是在这里显示地图需要很多时间,它正在下载图像然后显示地图。有没有办法先显示maps,然后下载图片并设置markers

这是我尝试过的代码

 @Override
public void onMapReady(GoogleMap googleMap) 
    mMap = googleMap;
    MapsInitializer.initialize(this);

    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    assert locationManager != null;
    String provider = locationManager.getBestProvider(criteria, true);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
        if (ActivityCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
            requestPermissions(new String[]
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION
            , LOCATION_REQUEST_CODE);
            return;
        
    
    mLastLocation = locationManager.getLastKnownLocation(provider);

    userLatLng = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());

    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLatLng, 14.0f));
    mMap.setMyLocationEnabled(true);
    mMap.getUiSettings().setZoomControlsEnabled(true);
    mMap.setBuildingsEnabled(true);
    try 
        bussinessBitmap = new AddMarkers(imgUrl2).execute().get();
     catch (InterruptedException e) 
        e.printStackTrace();
     catch (ExecutionException e) 
        e.printStackTrace();
    
    if (bussinessLatLng != null) 
        bussinessMarker = mMap.addMarker(new MarkerOptions()
                .position(bussinessLatLng)
                .title(businessUser)
                .snippet(getLocation(bussinessLatLng))
                .icon(BitmapDescriptorFactory.fromBitmap(getMarkerBitmapFromView(bussinessBitmap))));
     else 
        bussinessMarker = mMap.addMarker(new MarkerOptions()
                .position(bussinessLatLng)
                .title(businessUser)
                .snippet(getLocation(bussinessLatLng)));
    

    try 
        userBitmap = new AddMarkers(imgUrl).execute().get();
     catch (InterruptedException e) 
        e.printStackTrace();
     catch (ExecutionException e) 
        e.printStackTrace();
    
    if (mLastLocation != null) 
        if (userBitmap != null) 
            userMarker = mMap.addMarker(new MarkerOptions().position(userLatLng)
                    .title(username)
                    .snippet(getLocation(userLatLng))
                    .icon(BitmapDescriptorFactory.fromBitmap(getMarkerBitmapFromView(userBitmap))));
         else 
            userMarker = mMap.addMarker(new MarkerOptions().position(userLatLng)
                    .title(username)
                    .snippet(getLocation(userLatLng)));
        
    

    if(!(userLatLng == null || bussinessLatLng == null)) 

        Polyline distanceLine = mMap.addPolyline(new PolylineOptions().add(userLatLng, bussinessLatLng).width(4).color(Color.GREEN));
    

我正在使用asynctask 下载图片,这里是代码

public AddMarkers(String imgUrl) 
        this.imgUrl = imgUrl;
    

    @Override
    protected void onPreExecute() 
        super.onPreExecute();
        pd = new ProgressDialog(MapsActivity.this);
        pd.setTitle("Loading");
        pd.setMessage("Please wait..");
        pd.show();
    

    @Override
    protected Bitmap doInBackground(Void... voids) 

        URL url;
        try 
            url = new URL(imgUrl);
            return BitmapFactory.decodeStream(url.openConnection().getInputStream());

         catch (MalformedURLException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
        
        return null;
    

    @Override
    protected void onPostExecute(Bitmap bitmap) 
        super.onPostExecute(bitmap);
        if (pd != null && pd.isShowing()) pd.dismiss();
    

【问题讨论】:

使用 HashMap : ***.com/questions/37324285/… 我得到了预期的结果我有性能问题 地图仅在图片下载后可见 该图像是上述代码的输出,但它会在 4-5 秒后显示 【参考方案1】:

GoogleMap 对象有一个方法来设置地图加载时的回调。在您的 onMapReady 方法中添加以下内容:

mMap.setOnMapLoadedCallback(this);

并在你的类中有一个方法,然后实现回调:

@Override
public void OnMapLoaded() 
    AddMarkers addMarkersTask = new AddMarkers(url);
    addMarkersTask.execute();

【讨论】:

以上是关于如何先显示地图然后下载图像标记?的主要内容,如果未能解决你的问题,请参考以下文章

Android-Maps-Extensions 异步加载标记图像

如何将图像从Firebase下载到Swift,然后更快地在UIImageView中显示?

使用 Java 使用 Google Map 下载地图图像

如何从地图上的多个标记中单击一个标记,然后使用标记的信息转到一个活动

如何在 android imageview 上显示静态谷歌地图?

高德地图怎样实现实时定位,得到当前地点的坐标,位置