Bhavya Gandhi
Bhavya Gandhi

Reputation: 507

Google Map blink in Android TV when open for long time

I have android TV app which will run for long time .And I have google map inside that but after 20-24 hours google map starts blinking. Following link contains video of issue.

https://www.dropbox.com/s/vp8pbqc5z4zopbz/20180611_095004.mp4?dl=0

Edit

I can't share the whole source code, but I am using two fragments. One fragment contains map and another contains a listview of images. I call a webservice every 10 seconds and update listview images and bound map with locations I get in response of web service.

if ( map!=null) {
        if (activity.ambDetailList.size() > 0) {
            int i;
            double dist, currentLat = 0.0, currentLng = 0.0;
            ambOnlineList.clear();
            String ETA, SPEED;

            Marker marker;
            for (i = 0; i < activity.ambDetailList.size(); i++) {
                ambulanceDetail = activity.ambDetailList.get(i);
                dist = Math.sqrt(Math.pow(ambulanceDetail.getCurrentLat() - ambulanceDetail.getDestLat(), 2) + Math.pow(ambulanceDetail.getCurrentLng() - ambulanceDetail.getDestLng(), 2));
                double minute = ((dist * 100) / (ambulanceDetail.getSpeed() * 60 / 1000));
                double speed = ambulanceDetail.getSpeed() * 60 * 60 / 1000;
                Log.i("Minute", "----->>>>" + minute);
                if (speed >= 0.00 && speed <= 1.00) {
                    ETA = activity.getResources().getString(R.string.text_infinity);
                    SPEED = activity.getResources().getString(R.string.text_infinity);
                } else if (minute > 60) {
                    double hour = minute / 60;
                    int roundHour = (int) (minute / 60);
                    int min = (int) ((hour - roundHour) * 60);
                    ETA = roundHour + " hour " + min + " min";
                    SPEED = (int) (ambulanceDetail.getSpeed() * 60 * 60 / 1000) + " km/h ";
                } else {
                    ETA = (int) (minute) + " min ";
                    SPEED = (int) (ambulanceDetail.getSpeed() * 60 * 60 / 1000) + " km/h ";
                }

                ambulanceDetail.setEta(ETA);
                ambulanceDetail.setDisplayETA(ETA);
                ambulanceDetail.setDisplaySpeed(SPEED);

                if (markerList.get(ambulanceDetail.getAmbulanceId()) == null) {
                    MarkerOptions markerOptions = createMarker(ambulanceDetail);
                    marker = map.addMarker(markerOptions);
                    markerList.put(ambulanceDetail.getAmbulanceId(), marker);
                    markerArrayList.add(marker);
                    detailMap.put(marker, ambulanceDetail);
                } else {
                    marker = markerList.get(ambulanceDetail.getAmbulanceId());
                    if (marker.isVisible()) {
                        Location location = new Location("");
                        location.setLatitude(ambulanceDetail.getCurrentLat());
                        location.setLongitude(ambulanceDetail.getCurrentLng());
                        marker.setIcon(BitmapDescriptorFactory.fromBitmap(updateMarkerIcon(ambulanceDetail)));
                        marker.setPosition(new LatLng(ambulanceDetail.getCurrentLat(), ambulanceDetail.getCurrentLng()));
                    }
                }
                ArrayList<Integer> listId = new ArrayList<>();
                for (int m = 0; m < activity.ambDetailList.size(); m++) {
                    listId.add(activity.ambDetailList.get(m).getAmbulanceId());
                }
                for (int k = 0; k < markerArrayList.size(); k++) {
                    Marker m = markerArrayList.get(k);
                    if (!listId.contains(detailMap.get(m).getAmbulanceId())) {
                        markerArrayList.remove(m);
                        markerList.remove(detailMap.get(m).getAmbulanceId());
                        detailMap.remove(m);
                        m.remove();
                    }
                }
            }
            if (markerList.size() == 1 && activity.ambDetailList.size() == 1) {
                map.moveCamera(CameraUpdateFactory.newLatLngZoom(markerList.get(activity.ambDetailList.get(0).getAmbulanceId()).getPosition(), 16));
            } else {
                boundLatLang();
            }
            if (isFirstCall) {
                map.setBuildingsEnabled(true);
                isFirstCall = false;
            }
        } else {
            if (markerArrayList.size() > 0) {
                for (int i = 0; i < markerArrayList.size(); i++) {
                    Marker marker = markerArrayList.get(i);
                    marker.remove();
                }
                markerList.clear();
                markerArrayList.clear();
            }
            map.clear();
            if (detailMap.size() > 0)
                detailMap.clear();
        }
    }

Upvotes: 4

Views: 211

Answers (1)

Andrii Omelchenko
Andrii Omelchenko

Reputation: 13343

Anyway, you can restart application (or if that didn't helps - reboot device) before map starts blinking, for example after 15 hours of work (or e.g. 500 calls of web service):

...
Intent restartIntent = getBaseContext().getPackageManager()
         .getLaunchIntentForPackage( getBaseContext().getPackageName() );
restartIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(restartIntent);
...

Upvotes: 1

Related Questions