如何在一定时间后删除标记,即使应用程序已关闭?

时间:2017-11-07 18:36:31

标签: android google-maps maps

目前,我正在使用谷歌地图和标记在Android工作室应用程序中工作。 这个应用程序的想法是,用户只能被允许每一小时放一个标记,因此如果用户在一小时后向地图添加标记,标记应该消失。 问题是,即使用户关闭应用程序,我希望该标记在该小时内保留在地图中。我遇到问题,因为如果关闭它,标记将永远留在地图中。我怎么解决这个问题?当我关闭应用程序时,postDelayed会停止吗?我是否以正确的方式使用runnable和handler?

这是我的代码:

public void drawMarker(View view) {
        if (marker == null) {
            Location loc = returnLocation();
            Double lat = loc.getLatitude();
            Double lon = loc.getLongitude();
            //para guardar un marker en sharedPreferences
            sharedPreferences.edit().putString("Lat",String.valueOf(lat)).apply();
            sharedPreferences.edit().putString("Lng",String.valueOf(lon)).apply();
            marker = addMarker(loc);
            dialogPlayas.dismiss();
            removeMarker.setVisibility(View.VISIBLE);
            markerHandler = new Handler();
            markerHandler.postDelayed(timeRemoveMarker, 10000); //van a durar ua hora osea 3600000 milisegundos
        }
    }

    private Runnable timeRemoveMarker = new Runnable() {
        @Override
        public void run() {
            marker.remove();
            removeMarker.setVisibility(View.GONE);
            sharedPreferences.edit().remove("Lat").apply();
            sharedPreferences.edit().remove("Lng").apply();
            marker = null;
        }
    };


    public void removeMarkerButton(View view) {
        if (marker != null) {
            marker.remove();
            sharedPreferences.edit().remove("Lat").apply();
            sharedPreferences.edit().remove("Lng").apply();
            removeMarker.setVisibility(View.GONE);
            //markerHandler.removeCallbacks(timeRemoveMarker);
        }
        marker = null;
    }

这是我用来在重新启动应用时显示标记的代码:

@Override
    public void onMapReady(final GoogleMap googleMap) {
        mMap = googleMap;
        goToLocation();
        mMap.getUiSettings().setMapToolbarEnabled(false);

        sharedPreferences = this.getSharedPreferences("LatLng",MODE_PRIVATE);
        //Check whether your preferences contains any values then we get those values
       if((sharedPreferences.contains("Lat")) && (sharedPreferences.contains("Lng")))
        {
            Location loc = new Location("");
            String lat = sharedPreferences.getString("Lat","");
            String lng = sharedPreferences.getString("Lng","");
            LatLng position =new LatLng(Double.parseDouble(lat),Double.parseDouble(lng));
            Double latitude = Double.parseDouble(lat);
            Double longitude = Double.parseDouble(lng);
            loc.setLatitude(latitude);
            loc.setLongitude(longitude);
            addMarker(loc);
            removeMarker.setVisibility(View.VISIBLE);
        //mMap.setInfoWindowAdapter(new windowInfo(MapsActivity.this));
        }
    }

有什么想法来解决这个问题? 我还认为,如果用户删除了一个标记,那么处理程序应该停止运行,所以我正在做这样的事情

public void removeMarkerButton(View view) {
        if (marker != null) {
            marker.remove();
            sharedPreferences.edit().remove("Lat").apply();
            sharedPreferences.edit().remove("Lng").apply();
            removeMarker.setVisibility(View.GONE);
            markerHandler.removeCallbacks(timeRemoveMarker);
        }
        marker = null;
    }

但每当我添加一个游泳者并重启应用程序时,触摸删除按钮会使我的应用停止工作。那是因为removeCallbacks,但我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

drawMarker(View view)方法中,添加以下行:

sharedPreferences.edit().putLong("time",System.currentTimeMillis()).apply();

然后在onMapReady重新启动应用时,添加以下内容:

Long then = sharedPreferences.getLong("time",0);
long now = System.currentTimeMillis();
if (now - then > 3600000) { // 3600000 == 1 hour
    // not adding the marker
    return;
}