P҉h҉o҉e҉n҉i҉x҉
StateListAnimator почитай
Вроде он как то по другому реализовался, но все равно спасибо, использую эту если будет работать так как мне нужно.
Павел
dependencies { classpath "io.realm:realm-gradle-plugin:5.13.0" classpath 'com.android.tools.build:gradle:3.4.2' classpath 'io.realm:realm-gradle-plugin:3.5.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' classpath "io.realm:realm-gradle-plugin:1.0.1" }
Vadim
почему может leakовать такая конструкция? override fun onStart() { super.onStart() vm.state.items.subscribe { someListViewAdapter.submitList(it) }.untilStopped() }
Vadim
если быстро переключаться между экранами, при этом если вместо submitList(it) создавать новый адаптер, присваивать его recyclerview и потом отправлять туда список, то всё ок
Kost
А что делает submitList ?
Vadim
А что делает submitList ?
это стандартный метод ListAdapter’a, обновляет данные
Сергій
А как понял что течёт
Vadim
А как понял что течёт
leak canary, методом тыка начал проверять возможные места
Kost
Там clear есть? Я его не юзал особо
Vadim
в итоге вышло так, что если создавать новый адаптер на каждый эммит observable то мемори лик пропадает
Vadim
У меня еще этот список находится во фрагменте, который в tablayout’e
Kost
Попробуй вместо obaervable заюзать flowable
Kost
А у тебя во Вью модели объект, который храни список Лив дат?
Vadim
Попробуй вместо obaervable заюзать flowable
У меня и есть подписка на flowable в которую эмитит данные behaviorprocessor
Kost
Подписка на flowable, а эмитит behavprocessor?
Vadim
Подписка на flowable, а эмитит behavprocessor?
ну да, flowable не хранит в себе данных, ты ушел с экрана - вернулся behavprocessor вернул последний загруженный список
Kost
Backpreassurestrategy стоит буффер?
Vega
гайз, есть задача открыть пдф файл по ссылке. Погуглил, есть несколько вариантов: открыть в гугл док через веб вью, скачать локально и открыть чем-то на телефоне и отправить ссылку в браузер, оно там скачается и потом чем-нибудь открыть. Первые 2 варианты стремные, понравился второй, но там после перехода в браузер и нажатии кнопки назад не возвращаюсь в приложение. Кто какие вартианты юзает дял этого вообще? Как правильнее делать? Мб есть бест практис?
tRuNKator
Должно сохраняться позиция скрола при указании id вьюхе
Almas
В real time сделать дамп
Vega
Файл скачай в кэш и отобрази с помощью pdfview
вот эту либу? com.github.barteksc:android-pdf-viewer тоже как-то не круто тащить либу для просмотра пдфки, когда андроид сам могет показывать
Aleksandr
но сама либа довольно простая в использовании
Vega
но сама либа довольно простая в использовании
все таки проблема не в сложности, а в весе..)
Aleksandr
все таки проблема не в сложности, а в весе..)
ну вес можно убрать через бандлы для google play
Starikov
как поймать исключение из viewModelScope.launch{} ?
Vega
блин, чет реально для отображения в веб вьюшке пдфки нет ничего из корокби. Наверное остановлюс на интенте в браузер
Starikov
так сделал. не помогает
Vadim
к вопросу об этом
при этом override fun onStart() { super.onStart() vm.state.items.subscribe { binding().rv.adapter = ListAdapter().apply { submitList(it) } }.untilStopped() } работает без memory leaka
Vadim
ватафака 😄
Starikov
исключение не ловится, приложение падает
Starikov
try { this@ProfileActivity.viewModel.saveStudent() } catch (e: Exception) { Toast.makeText(this@ProfileActivity, e.message, Toast.LENGTH_SHORT).show() } viModel: try { viewModelScope.launch(handler) { val student = Student( name.value!!, surname.value!!, patronymic.value!!, university.value!!, emailOrPhone.value!!, -1 ) runBlocking(handler) { repository.saveStudent(student) } } } catch (e: Exception) { throw e }
Ivan
throw e зачем?
Starikov
когда исключение вылетает, тост не показывает, а крашит приложение
Kost
к вопросу об этом
Погоди, у тебя внутри ресайклер Вью констра?
Starikov
throw e зачем?
и без него было, я уже просто везде где можно пихать try стал
Vadim
viewholderы все с constraintlayout’ом
Kost
Вот изза этого м может ликовать
Kost
Каждый раз для элемента перерасчёт местоположенич
Kost
Попробуй сделать через линеар или рэлейтив
Vadim
Каждый раз для элемента перерасчёт местоположенич
если я адаптер создаю заново, то лик пропадает
Vadim
ну и как бы у меня список не меняется соответсвенно перерисовки нету т.к. это listadapter
Vadim
перенес создание адаптера из onCreate в onCreateView - лика тоже нету
Vadim
выходит что каждый раз нужно адаптер создавать, иначе список сэтится в какой-то старый инстанс
Vadim
и он не может принять смерть достойно
Сергій
какая-то хрень )
Сергій
у тебя что-то где-то не чисто
Alex Android
Лул, можно запросить пермишн через шелл и юзер ничего не заметит
Александр
Вопрос по интегарционным тестам. В @Before я ручками инициализирую ретрофитовские классы, чтобы получить реальные данные с сервера и работать дальше с ними. Правильнее ли будет замокать ретрофитовские классы и возвращать захардкоженные данные при обращении к ним? Кода блин дофига получается с ручной инициализацией, а дотянуть даггер не получается, сложна.
Олег
ты хочешь тестировать интеграцию классов или то, насколько стабильно работает сеть/бэк?
Starikov
падает на самом первом exception из repository. там идет throw чтобы выше передать , но catch выше не славливает
Vadim
какая-то хрень )
согласен. как найти хрень незнаю
Denis
сразу поймешь, почему твой способ не работает
Сергій
согласен. как найти хрень незнаю
искать статики, проверить умирает ли вью фрагмента после того как и ушел с экрана, показать код
Александр
ты хочешь тестировать интеграцию классов или то, насколько стабильно работает сеть/бэк?
Наверное и то и другое, хочу проверять корректный ли пришёл ответ, распарсился ли он и закешировался ли.
Сергій
проветить профайлером, вызвать gc и потом сделать дамп
Александр
Да, вполне
Смущает малясь что респонс захардкоженный, если поменяется апи - тест перестанет быть валидным.
Alex Android
Создавай по модели и конверти в жсон
Alex Android
Ну или как там у тебя. При изменении модели сразу будут ошибки компиляции в тесте
Alex Android
Тесты меняются под задачу. Задача изменилась - меняются и тесты
Starikov
Спасибо, Оганнес
Starikov
хорошо, прочту
Starikov
можно тогда еще спросить? как замерить время выполнения корутины? пробовал с runBlocking{} но не знаю верно ли
Starikov
а если она в IO запускается? я считаю время выполнения запроса на сервер и сохранения в бд
Starikov
ок, еще раз спасибо)
Starikov
так сработает? val startTime = System.currentTimeMillis() Log.d("TIME", "startTime = $startTime") runBlocking { sendResultToServer(it) } val middleTime = System.currentTimeMillis() Log.d("TIME", "middleTime = $middleTime, clock0 = ${middleTime - startTime}") runBlocking { saveResultToDatabase() } val endTime = System.currentTimeMillis() Log.d("TIME", "endTime = $endTime, clock1 = ${endTime - middleTime}") Log.d("TIME", "clock2 = ${endTime - startTime}") saveResult() - это обе suspend функции которые выполняются в withContext(IO) ?
Александр
Тесты меняются под задачу. Задача изменилась - меняются и тесты
Создавать по нетворк моделям - логично кстати, спасибо. По поводу изменений в апи - это ведь не всегда изменение в задаче. Так (наверное) бывает, что "мы малясь поменяли апи, но мы вам чёт забыли сказать. Почему поменяли - не ваше дело, набор данных не изменился, поправьте там у себя на клиенте, чтобы всё работало". И если бы у меня был тест, который чекал пришедший ответ на корректность, такие ситуации можно было бы быстрее детектить.
Starikov
viewModel.run { sendResultToServer(it) saveResultToDatabase() } ок. вот эти две функции выполняются в viewModeScope я хочу просто измерить время их выполнения. выполняются они в withContext(IO) просто нужно узнать сильно долго выполняются два действия или нет