mirror of
https://github.com/FoggedLens/deflock-app.git
synced 2026-05-15 05:30:33 +02:00
lot of changes, got rid of custom cache stuff, now stepping in the way of http fetch instead of screwing with flutter map.
This commit is contained in:
@@ -9,15 +9,10 @@ import '../network_status.dart';
|
||||
/// Global semaphore to limit simultaneous tile fetches
|
||||
final _tileFetchSemaphore = _SimpleSemaphore(4); // Max 4 concurrent
|
||||
|
||||
/// Cancellation token to invalidate all pending requests
|
||||
int _globalCancelToken = 0;
|
||||
|
||||
/// Clear queued tile requests and cancel all retries
|
||||
/// Clear queued tile requests when map view changes significantly
|
||||
void clearOSMTileQueue() {
|
||||
final oldToken = _globalCancelToken;
|
||||
_globalCancelToken++; // Invalidate all pending requests and retries
|
||||
final clearedCount = _tileFetchSemaphore.clearQueue();
|
||||
debugPrint('[OSMTiles] Cancel token: $oldToken -> $_globalCancelToken, cleared $clearedCount queued');
|
||||
debugPrint('[OSMTiles] Cleared $clearedCount queued tile requests');
|
||||
}
|
||||
|
||||
/// Fetches a tile from OSM, with in-memory retries/backoff, and global concurrency limit.
|
||||
@@ -37,17 +32,7 @@ Future<List<int>> fetchOSMTile({
|
||||
kTileFetchThirdDelayMs + random.nextInt(kTileFetchJitter3Ms),
|
||||
];
|
||||
|
||||
// Remember the cancel token when we start this request
|
||||
final requestCancelToken = _globalCancelToken;
|
||||
print('[fetchOSMTile] START $z/$x/$y with token $requestCancelToken (global: $_globalCancelToken)');
|
||||
|
||||
while (true) {
|
||||
// Check if this request was cancelled
|
||||
if (requestCancelToken != _globalCancelToken) {
|
||||
print('[fetchOSMTile] CANCELLED $z/$x/$y (token: $requestCancelToken vs $_globalCancelToken)');
|
||||
throw Exception('Tile request cancelled');
|
||||
}
|
||||
|
||||
await _tileFetchSemaphore.acquire();
|
||||
try {
|
||||
print('[fetchOSMTile] FETCH $z/$x/$y');
|
||||
@@ -55,12 +40,6 @@ Future<List<int>> fetchOSMTile({
|
||||
final resp = await http.get(Uri.parse(url));
|
||||
print('[fetchOSMTile] HTTP ${resp.statusCode} for $z/$x/$y, length=${resp.bodyBytes.length}');
|
||||
|
||||
// Check cancellation after HTTP request completes - this is the key check!
|
||||
if (requestCancelToken != _globalCancelToken) {
|
||||
print('[fetchOSMTile] CANCELLED $z/$x/$y after HTTP (token: $requestCancelToken vs $_globalCancelToken)');
|
||||
throw Exception('Tile request cancelled');
|
||||
}
|
||||
|
||||
if (resp.statusCode == 200 && resp.bodyBytes.isNotEmpty) {
|
||||
print('[fetchOSMTile] SUCCESS $z/$x/$y');
|
||||
NetworkStatus.instance.reportOsmTileSuccess();
|
||||
@@ -71,11 +50,6 @@ Future<List<int>> fetchOSMTile({
|
||||
throw HttpException('Failed to fetch tile $z/$x/$y: status ${resp.statusCode}');
|
||||
}
|
||||
} catch (e) {
|
||||
// Don't retry cancelled requests
|
||||
if (e.toString().contains('cancelled')) {
|
||||
rethrow;
|
||||
}
|
||||
|
||||
print('[fetchOSMTile] Exception $z/$x/$y: $e');
|
||||
|
||||
// Report network issues on connection errors
|
||||
@@ -92,19 +66,7 @@ Future<List<int>> fetchOSMTile({
|
||||
|
||||
final delay = delays[attempt - 1].clamp(0, 60000);
|
||||
print("[fetchOSMTile] Attempt $attempt for $z/$x/$y failed: $e. Retrying in ${delay}ms.");
|
||||
|
||||
// Check cancellation before and after delay
|
||||
if (requestCancelToken != _globalCancelToken) {
|
||||
print('[fetchOSMTile] CANCELLED $z/$x/$y before retry');
|
||||
throw Exception('Tile request cancelled');
|
||||
}
|
||||
|
||||
await Future.delayed(Duration(milliseconds: delay));
|
||||
|
||||
if (requestCancelToken != _globalCancelToken) {
|
||||
print('[fetchOSMTile] CANCELLED $z/$x/$y after retry delay');
|
||||
throw Exception('Tile request cancelled');
|
||||
}
|
||||
} finally {
|
||||
_tileFetchSemaphore.release();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user