Handle allocation failure [Core feature] (#4178)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Alex Cristici
2026-04-22 14:03:58 +03:00
committed by GitHub
parent 9f8667cf44
commit 14a81ec831
44 changed files with 295 additions and 85 deletions

View File

@@ -58,6 +58,8 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
= new CopyOnWriteArrayList<>();
private final List<MapView.OnSpriteRequestedListener> onSpriteRequestedList
= new CopyOnWriteArrayList<>();
private final List<MapView.OnRenderErrorListener> onRenderErrorList
= new CopyOnWriteArrayList<>();
@Override
public void onCameraWillChange(boolean animated) {
@@ -424,6 +426,20 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
}
}
@Override
public void onRenderError() {
try {
if (!onRenderErrorList.isEmpty()) {
for (MapView.OnRenderErrorListener listener : onRenderErrorList) {
listener.onRenderError();
}
}
} catch (Throwable err) {
Logger.e(TAG, "Exception in onRenderError", err);
throw err;
}
}
void addOnCameraWillChangeListener(MapView.OnCameraWillChangeListener listener) {
onCameraWillChangeListenerList.add(listener);
}
@@ -592,6 +608,10 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
onSpriteRequestedList.add(callback);
}
public void addOnRenderErrorListener(MapView.OnRenderErrorListener callback) {
onRenderErrorList.add(callback);
}
public void removeOnPreCompileShaderListener(MapView.OnPreCompileShaderListener callback) {
onPreCompileShaderList.remove(callback);
}
@@ -632,6 +652,10 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
onSpriteRequestedList.remove(callback);
}
public void removeOnRenderErrorListener(MapView.OnRenderErrorListener callback) {
onRenderErrorList.remove(callback);
}
void clear() {
onCameraWillChangeListenerList.clear();
onCameraIsChangingListenerList.clear();
@@ -658,5 +682,6 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
onSpriteLoadedList.clear();
onSpriteErrorList.clear();
onSpriteRequestedList.clear();
onRenderErrorList.clear();
}
}

View File

@@ -1064,7 +1064,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
}
/**
* Set a callback that's invoked after a sprite fails to laod.
* Set a callback that's invoked after a sprite fails to load.
*
* @param listener The callback that's invoked after a sprite fails to load
*/
@@ -1073,7 +1073,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
}
/**
* Removes a callback that's invoked after a sprite fails to laod.
* Removes a callback that's invoked after a sprite fails to load.
*
* @param listener The callback that's invoked after a sprite fails to load
*/
@@ -1099,6 +1099,28 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
mapChangeReceiver.removeOnSpriteRequestedListener(callback);
}
/**
* Set a callback that's invoked after an error occurs
* while trying to render a layer or drawable.
*
* @param listener The callback that's invoked after an error occurs
* while trying to render a layer or drawable.
*/
public void addOnRenderErrorListener(MapView.OnRenderErrorListener callback) {
mapChangeReceiver.addOnRenderErrorListener(callback);
}
/**
* Removes a callback that's invoked after an error occurs
* while trying to render a layer or drawable.
*
* @param listener The callback that's invoked after an error occurs
* while trying to render a layer or drawable.
*/
public void removeOnRenderErrorListener(MapView.OnRenderErrorListener callback) {
mapChangeReceiver.removeOnRenderErrorListener(callback);
}
/**
* Interface definition for a callback to be invoked when the camera will change.
* <p>
@@ -1513,6 +1535,20 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
void onSpriteRequested(@NonNull String id, @NonNull String url);
}
/**
* Interface definition for a callback to be invoked after an error occurs
* while trying to render a layer or drawable.
* <p>
* {@link MapView#addOnRenderErrorListener(OnRenderErrorListener)}
* </p>
*/
public interface OnRenderErrorListener {
/**
* Called when an error occurs while trying to render a layer or drawable.
*/
void onRenderError();
}
/**
* Sets a callback object which will be triggered when the {@link MapLibreMap} instance is ready to be used.
*

View File

@@ -1379,6 +1379,13 @@ final class NativeMapView implements NativeMap {
}
}
@Keep
private void onRenderError() {
if (stateCallback != null) {
stateCallback.onRenderError();
}
}
//
// JNI methods
//
@@ -1867,5 +1874,7 @@ final class NativeMapView implements NativeMap {
void onSpriteError(String id, String url);
void onSpriteRequested(String id, String url);
void onRenderError();
}
}