Еще пара слов об ошибках UX в Телеграме. Как я писал раньше — все, кто занимается Телеграмом, без исключения сказали мне, что любой канал непрерывно теряет аудиторию, если не поддерживать его рекламой. Я поразмыслил, почему так, и ответ довольно очевиден.
Сообщения в каналах приходят человеку напрямую, с уведомлением, в каком-то смысле навязываются ему и требуют внимания. Не как в других соцсетях — человек видит ленту когда сам зашёл её посмотреть. А как в телефонных звонках — человек отвлекается от текущих дел внешним раздражителем.
Даже если уведомления отключены — а у большинства они в каналах отключены — это лишь более мягкая версия такого внедрения. Канал поднимается вверх в списке чатов. При этом канал напоминает о своём существовании, и тот процент подписчиков, кому он не очень интересен, может отписаться. А такой процент всегда есть, при любом качестве контента.
Получается, что Телеграм наказывает авторов за посты. Если ты сидишь молча, твои подписчики падают медленнее, чем если пишешь. И это прям жёсткий косяк, одна из самых серьёзных ошибок команды Дурова. Причем, это именно просчёт, а не умысел, потому что сейчас Телеграм с рекламы между каналами не получает ничего.
#web
🚀 Вышел стабильный JavaScript движок от Google для Android
Новая стабильная библиотека Jetpack JavaScript Engine позволит разработчикам выполнять JS код в изолированной и ограниченной среде.
class MainActivity : ComponentActivity() {
// Теперь nullable, без lateinit
private var jsSandbox: JavaScriptSandbox? = null
private var jsIsolate: JavaScriptIsolate? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!JavaScriptSandbox.isSupported()) {
Log.e("JS", "JavaScriptSandbox не поддерживается")
return
}
lifecycleScope.launch {
// Создаём и сохраняем в nullable-поле
jsSandbox = JavaScriptSandbox
.createConnectedInstanceAsync(applicationContext)
.await()
jsIsolate = jsSandbox?.createIsolate()
// При выполнении гарантируем, что jsIsolate != null
val result: String = jsIsolate
?.evaluateJavaScriptAsync(JS_SCRIPT_SCRING)
?.await()
?: "Ошибка: isolate не инициализирован"
Log.d("JS", "Результат выполнения: $result")
}
}
override fun onDestroy() {
super.onDestroy()
// Закрываем только если не null
jsIsolate?.close()
jsSandbox?.close()
}
}
#jetpack#js