Size: a a a

StartAndroid Ru Chat

2021 March 11

S

Shams in StartAndroid Ru Chat
Albert Abdullin
Я уже час пытаюсь поймать. И я не могу понять в чем дело. На отладке делаешь - все норм. Без отладки - крашится. Поэтому у меня появились предположения, что дело в многопоточности. Хотя раньше всегда работало все
1. Set data to adapter
2. Remove some item, or all data from list
3. Scroll recycler

Попробуй так. Я так смог воспроизводить этот краш
источник

S

Shams in StartAndroid Ru Chat
Shams
1. Set data to adapter
2. Remove some item, or all data from list
3. Scroll recycler

Попробуй так. Я так смог воспроизводить этот краш
При этом не вызывай notifydatasetchanged() после 2 пункта
источник

AA

Albert Abdullin in StartAndroid Ru Chat
Видимо, это как-то с многопоточностью связано. Начал удалять элементы в ui-потоке непосредственно перед вызовом метода адаптера. Крашей за 20 тестов не случилось. Но повторюсь, что это дико странно. Так как добавление элементов по одному, загрузка общего количества за раз и изменение элементов списка происходит и всегда происходило в фоновом потоке. Там все работает
источник

AA

Albert Abdullin in StartAndroid Ru Chat
А удаление прям - в первый раз такое. Даже время на это тратить то не хотелось. Бред какой-то
источник

I

Ivan in StartAndroid Ru Chat
Albert Abdullin
А удаление прям - в первый раз такое. Даже время на это тратить то не хотелось. Бред какой-то
если я правильно понял то ты в цикле удаляешь элементы из листа. А потом также 500 раз вызываешь notifyItemRemoved ибо это через postValue сделано
источник

I

Ivan in StartAndroid Ru Chat
нет никакого порядка вызова, postValue это что такое? Типа хендлер на UI?
источник

AA

Albert Abdullin in StartAndroid Ru Chat
Ivan
нет никакого порядка вызова, postValue это что такое? Типа хендлер на UI?
Да. Я решил, что хэндлер для обновления данных не нужен, раз есть postVlaue
источник

I

Ivan in StartAndroid Ru Chat
Albert Abdullin
Да. Я решил, что хэндлер для обновления данных не нужен, раз есть postVlaue
так это из лайвдаты или что?)
источник

AA

Albert Abdullin in StartAndroid Ru Chat
Ivan
если я правильно понял то ты в цикле удаляешь элементы из листа. А потом также 500 раз вызываешь notifyItemRemoved ибо это через postValue сделано
Все верно описали. Такой алгоритм. Только уж не 500 раз, а количеству, равным выбранных элементов для удаления
источник

I

Ivan in StartAndroid Ru Chat
В любом случае я думаю он просто кладёт в очередь на UI тред.
И у тебя может быть такое:
1) Удаление из списка
2) Удаление из списка
3) Удаление из списка
4) notifyItemRemoved
5) Удаление из списка
6) notifyItemRemoved
7) notifyItemRemoved

то есть абсолютно в рандомном порядке эти вызовы идут
источник

AA

Albert Abdullin in StartAndroid Ru Chat
Конечно вместо цикла можно было бы removeAll
источник

I

Ivan in StartAndroid Ru Chat
я бы тебе советовал всё переделать на одну операцию через removeAll, да
источник

I

Ivan in StartAndroid Ru Chat
Может быть, может быть, тебя спасёт CopyOnWriteArrayList (для adapterListOfEntitiesVM)
источник

AA

Albert Abdullin in StartAndroid Ru Chat
Ivan
В любом случае я думаю он просто кладёт в очередь на UI тред.
И у тебя может быть такое:
1) Удаление из списка
2) Удаление из списка
3) Удаление из списка
4) notifyItemRemoved
5) Удаление из списка
6) notifyItemRemoved
7) notifyItemRemoved

то есть абсолютно в рандомном порядке эти вызовы идут
Не-не-не. У меня скобок же нет. Он сперва в цикле удаляет элементы из списка. И только затем один раз postValue
источник

I

Ivan in StartAndroid Ru Chat
Аа, понял
источник

AA

Albert Abdullin in StartAndroid Ru Chat
Ivan
я бы тебе советовал всё переделать на одну операцию через removeAll, да
Да. Глаз мазолится. Всегда нужен взгляд со стороны. Это правильное решение
источник

I

Ivan in StartAndroid Ru Chat
Albert Abdullin
Не-не-не. У меня скобок же нет. Он сперва в цикле удаляет элементы из списка. И только затем один раз postValue
так может в Observer вместо многократного вызова notifyItemRemoved вызвать notifyItemRangeRemoved и всё?
источник

I

Ivan in StartAndroid Ru Chat
или там позиции не по порядку могут идти
источник

AA

Albert Abdullin in StartAndroid Ru Chat
Ivan
так может в Observer вместо многократного вызова notifyItemRemoved вызвать notifyItemRangeRemoved и всё?
Диапазон - это когда элементы списка идут подряд. А у меня они в хаотичном порядке могут быть
источник

I

Ivan in StartAndroid Ru Chat
да, понял
источник