Я уверен, что это невозможно. Внешний SVG не является частью DOM в способе встроенного SVG, и я не верю, что вы можете получить доступ к дереву SVG DOM из загружаемого документа.
Что вы можете do загружает SVG как XML, используя запрос AJAX, и вставляет его в DOM в качестве встроенного SVG, после чего вы можете ходить и манипулировать. Этот пример D3 демонстрирует технику. Я думаю, что используемая здесь функция d3.xml()
более или менее эквивалентна jQuery $.ajax()
с dataType: "xml"
.
Простой способ в Kotlin - использовать сопрограммы и приостанавливать функции
class YourClass : CoroutineScope {
// context for main thread
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + Job()
fun toDoSmth() {
launch {
withContext(Dispatchers.IO) {
// task(1) do smth in another thread
}
// do smth in main thread after task(1) is finished
}
}
}
. Читайте также о Диспетчерах
. Обработка сообщений строго связана с Android . Но на самом деле вы не хотите отправлять сообщение обработчику. На самом деле вы запускаете код только в этом потоке. Таким образом, вместо того, чтобы использовать сообщения, которые вы делаете, вы должны просто позвонить post(Runnable)
:
val uiThreadHandler = Handler(Looper.getMainLooper())
uiThreadHandler.post {
...
}
Чтобы абстрагировать это еще дальше, вы можете использовать Kotlin Coroutines с расширением Android для Dispatchers.Main
:
GlobalScrope.launch(Dispatchers.Main) {
...
}
Блок будет запланирован в главном потоке Android . Если вы ничего не приостанавливаете в самом блоке, что может иметь место из-за того, что вы не используете сопрограмм прямо сейчас, вам не нужно беспокоиться об отмене Job
возвращается из launch
.