Comments (4)
Мои попытки фиксов V2:
removeViewAt
в YamapViewManager в try catch
Решил попробовать полностью обернуть removeViewAt
в try catch, чтобы понять, правильно ли локализовал место краша
public void removeViewAt(YamapView parent, int index) {
try {
parent.removeChild(index);
super.removeViewAt(parent, index);
Log.d("!!!removeViewAt", "success");
} catch (Exception e) {
Log.d("!!!removeViewAt", e.getMessage());
}
}
Это не принесло результатов, лог в catch ни разу не отработал, хотя краш проявился
![image](https://private-user-images.githubusercontent.com/15292833/333210935-bfc23b52-b4a4-45fa-8e26-229eaf2fe1c7.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ1ODgxOTUsIm5iZiI6MTcyNDU4Nzg5NSwicGF0aCI6Ii8xNTI5MjgzMy8zMzMyMTA5MzUtYmZjMjNiNTItYjRhNC00NWZhLThlMjYtMjI5ZWFmMmZlMWM3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI1VDEyMTEzNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWJhNGQzYmNmMDI0ZWFiMjQ2YTFiMTUyYmQyYTJmMDhlMmJkZWE0YWMxN2UzZThlMDZiNzNmNTE4ODRlYzExMTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.WtMW0KMu2LyaiYSAz-AyQKQHtvqMqHKobQiYrUFcs7E)
from react-native-yamap.
Мои попытки фиксов:
Обновление либы
Попробовал перейти на либу react-native-yamap-plus, в которой используется нативный map-kit версии 4.6.1. Проблема не пропала
Фикс в removeChild
в YamapView
Стектрейс указывает на remove a view
в ru.vvdev.yamap.view.YamapView
внутри YamapView
видим метод removeChild
, внутри которого уже реализованы проверки на наличие mapObject
, те тут проблем возникать не должно
if (getChildAt(index) instanceof ReactMapObject) {
final ReactMapObject child = (ReactMapObject) getChildAt(index);
if (child == null) return;
final MapObject mapObject = child.getMapObject();
if (mapObject == null || !mapObject.isValid()) return;
getMap().getMapObjects().remove(mapObject);
}
Однако на всякий случай пробуем отловить краш в try catch
public void removeChild(int index) {
try {
if (getChildAt(index) instanceof ReactMapObject) {
final ReactMapObject child = (ReactMapObject) getChildAt(index);
if (child == null) return;
final MapObject mapObject = child.getMapObject();
if (mapObject == null || !mapObject.isValid()) return;
Log.d("!!!removeChild success", String.valueOf(index));
getMap().getMapObjects().remove(mapObject);
}
} catch (Exception e) {
Log.d("!!!removeChild error", e.getMessage());
}
}
Но это не помогает, краши все равно воспроизводятся, лог removeChild error
никогда не выводится
Фикс в removeViewAt
в YamapViewManager
Тк падение не отловилось через try catch в YamapView
, смотрю на removeViewAt, который последовательно вызывает
parent.removeChild(index);
super.removeViewAt(parent, index);
пробую проверить гипотезу, что parent.removeChild
отрабатывает корректно, а super.removeViewAt падает
Изменение порядка вызовов
Обычно super
методы вызываются в самом начале, пробуем изменить порядок вызовов
public void removeViewAt(YamapView parent, int index) {
super.removeViewAt(parent, index);
parent.removeChild(index);
}
Это не помогает
Опциональный вызов super.removeViewAt
попробовал возвращать булеан из removeChild
, чтобы понимать снаружи, что удаление прошло корректно
public boolean removeChild(int index) {
try {
if (getChildAt(index) instanceof ReactMapObject) {
final ReactMapObject child = (ReactMapObject) getChildAt(index);
if (child == null) return false;
final MapObject mapObject = child.getMapObject();
if (mapObject == null || !mapObject.isValid()) return false;
getMap().getMapObjects().remove(mapObject);
return true;
}
} catch (Exception e) {
Log.d("!!!removeChild error", e.getMessage());
return false;
}
return false;
}
и далее вызывать super.removeViewAt
только если removeChild
вернул true
, те удаление прошло успешно
public void removeViewAt(YamapView parent, int index) {
if (parent.removeChild(index)) {
super.removeViewAt(parent, index);
}
}
Это тоже не помогло, краши остались
Дополнительная проверка на наличие чайлда через super
Перед вызовом super.removeViewAt
делаю дополнительную проверку на наличие чайлда по индексу, по которому предполагается удаление
public void removeViewAt(YamapView parent, int index) {
if (parent.removeChild(index)) {
if (super.getChildAt(parent, index) != null) {
super.removeViewAt(parent, index);
}
}
}
это тоже не помогает
Аналогично не помогает проверка на размер списка детей
public void removeViewAt(YamapView parent, int index) {
if (parent.removeChild(index)) {
if (super.getChildCount(parent) > index) {
super.removeViewAt(parent, index);
}
}
}
from react-native-yamap.
Гипотезы и вопросы:
- Нативный код падает, но приложение не крашится. Падает в каком-то потоке, который не критичен для работы JS?
- Карта практически не падает на сильных устройствах, но зато стабильно падает, когда воспроизвожу на загруженном тормозящем эмуляторе. Проблема в каком-то race condition, который усугубляется на медленных девайсах?
from react-native-yamap.
По стектрейсу падает в этом месте react-native-reanimated
.
🟢 Пробовали вариант с включением enableLayoutAnimations(true)
из react-native-reanimated
, проблема пропадает, видим динамику снижения крашей на пользователях.
🟡 Но при этом крайне редко бывает что не отрисовываются новые пины до тех пор пока снова не подвигаешь карту
🔴 Что еще пробовали, но не помогло
[email protected]
→ 4.6.0[email protected]
→ 3.11.0,[email protected]
[email protected]
→ 0.73.4[email protected]
,[email protected]
,[email protected]
from react-native-yamap.
Related Issues (20)
- Как выполнить fitAllMarkers() и fitMarkers() при инициализации карты? HOT 1
- карта не всегда отображается с необходимым размером (Height) на ios HOT 2
- Вылетает HOT 3
- Placemark
- Есть ли возможность уменьшить размер пакета?
- Есть ли возможность стилизации или установки кастомного кластера ?
- Geocoder.addressToGeo Giving wrong coordinates
- After upgrade to expo sdk 51 YaMap.init() crashes the app HOT 1
- TypeError: Cannot read property 'init' of null, js engine: hermes HOT 3
- showUserPostition={true} crash HOT 1
- пустые метки пока на них не нажму HOT 1
- fatal signal HOT 1
- Инициализация карты с помощью предварительно запрошенного ключа
- Проблема с отображением <Image /> в children у маркера HOT 1
- How to convert app.config.js for expo
- Android: Problem with marker display: null cannot be cast to non-null type HOT 1
- Android. Add possibility to use 'play-services-location' deps version from the client-side
- Android: Не срабатывает onPress маркера в ClusteredYamap HOT 1
- Как получить координаты пользователя?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from react-native-yamap.