Changeset 8815 in josm for trunk/src


Ignore:
Timestamp:
2015-10-01T21:45:34+02:00 (9 years ago)
Author:
wiktorn
Message:

Improve tile display when imagery server returns errors randomly.

  • maintain current tile when calling "Load Tile" and company
  • if tile has failed loading, try to display stale content from cache together with error message
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java

    r8768 r8815  
    166166
    167167        try {
    168             if (!tile.isLoaded()) { //if someone else already loaded tile, skip all the handling
    169168                tile.finishLoading(); // whatever happened set that loading has finished
    170169                // set tile metadata
     
    178177                case SUCCESS:
    179178                    handleNoTileAtZoom();
    180                     if (object != null) {
    181                         byte[] content = object.getContent();
    182                         if (content != null && content.length > 0) {
    183                             tile.loadImage(new ByteArrayInputStream(content));
    184                             if (tile.getImage() == null) {
    185                                 tile.setError(tr("Could not load image from tile server"));
    186                                 status = false;
    187                             }
    188                         }
    189                     }
    190179                    int httpStatusCode = attributes.getResponseCode();
    191180                    if (!isNoTileAtZoom() && httpStatusCode >= 400) {
     
    197186                        status = false;
    198187                    }
     188                    status &= tryLoadTileImage(object); //try to keep returned image as background
    199189                    break;
    200190                case FAILURE:
    201191                    tile.setError("Problem loading tile");
    202                     // no break intentional here
     192                    tryLoadTileImage(object);
    203193                    break;
    204194                case CANCELED:
     
    206196                    // do nothing
    207197                }
    208             }
    209198
    210199            // always check, if there is some listener interested in fact, that tile has finished loading
     
    327316    }
    328317
    329 
     318    private boolean tryLoadTileImage(CacheEntry object) throws IOException {
     319        if (object != null) {
     320            byte[] content = object.getContent();
     321            if (content != null && content.length > 0) {
     322                tile.loadImage(new ByteArrayInputStream(content));
     323                if (tile.getImage() == null) {
     324                    tile.setError(tr("Could not load image from tile server"));
     325                    return false;
     326                }
     327            }
     328        }
     329        return true;
     330    }
    330331}
Note: See TracChangeset for help on using the changeset viewer.