Size: a a a

Android Architecture

2020 May 06

А

Андрей in Android Architecture
Eugene Kostyuk
Добрый вечер! Возник интересный кейс. У меня приложение условно разделено на три слоя, ui, domain, data. ui и data не знают друг о друге и общаются через domain. В качестве асинхронной составляющей корутины. Сам кейс в том, что на слое даты есть Firebase и у него есть Колбэк об обновлении данных. Как я могу прикидывать эти данные с data на ui при этом не прокидывая такой колбэк через весь проект?
Можно коллбек заменить на flow, используя callbackFlow.
источник

EK

Eugene Kostyuk in Android Architecture
Андрей
Можно коллбек заменить на flow, используя callbackFlow.
Хм, это что-то для меня новое, чекну тоже
источник

YW

Yakov Weber in Android Architecture
class WindowsSizeNotifier {
   private val action = ConflatedBroadcastChannel<WindowsSize>()
   fun setNewWindowSize(size: WindowsSize) {
       action.offer(size)
   }

   fun sizeChanges() = action.asFlow()
}
источник

А

Андрей in Android Architecture
Eugene Kostyuk
Хм, это что-то для меня новое, чекну тоже
Просто тоже сейчас юзаю firebase c похожим кейсом и этот вариант хорошо живет.
источник

EK

Eugene Kostyuk in Android Architecture
@mentarey @yakowweber спасибо, как минимум есть пища о размышлении и пробел в знаниях)
источник

YW

Yakov Weber in Android Architecture
Андрей
Можно коллбек заменить на flow, используя callbackFlow.
Вроде как это будет холодный поток, ну если он подходит то тоже можно заюзать
источник

А

Андрей in Android Architecture
Yakov Weber
Вроде как это будет холодный поток, ну если он подходит то тоже можно заюзать
Там под капотом ченелы,  поэтому он горячий.
источник

YW

Yakov Weber in Android Architecture
https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/callback-flow.html  Creates an instance of the cold Flow with elements that are sent to a SendChannel provided to the builder’s block of code via ProducerScope. It allows elements to be produced by code that is running in a different context or concurrently.
источник

YW

Yakov Weber in Android Architecture
Андрей
Там под капотом ченелы,  поэтому он горячий.
Все таки холодный
источник

НЭ

Некрутов Эдуард... in Android Architecture
Всем привет. Есть новая либа для навигации заточенная под многомодульный проект. В этом канале можно делиться библиотеками?
источник

АЕ

Алексей Ершов... in Android Architecture
Можно, делитесь и кидайте ссылку на чат)
источник

НЭ

Некрутов Эдуард... in Android Architecture
git + /NekrutovEd/Multi-Module-Navigation
источник

I

Igor in Android Architecture
Было бы очень интересно увидеть табличку сравнения с другими либами.
И почитать, о том, что сподвигло на написание либы
источник

НЭ

Некрутов Эдуард... in Android Architecture
Igor
Было бы очень интересно увидеть табличку сравнения с другими либами.
И почитать, о том, что сподвигло на написание либы
Я пока хочу набрать вопросов и после написать статейку с описанием, сравнением и ответами на вопросы.
источник

НЭ

Некрутов Эдуард... in Android Architecture
Основной принцип, это отдельная сущность, которая умеет создавать фрагмент и проставлять зависимости. И навигация осуществляется через эту сущность. В данной реализации это FragmentModule
источник

НЭ

Некрутов Эдуард... in Android Architecture
В readme есть описание плюсов данной реализации.
источник

AD

Aleksey D. in Android Architecture
Некрутов Эдуард
Я пока хочу набрать вопросов и после написать статейку с описанием, сравнением и ответами на вопросы.
зачем зависеть от Toothpick, если можно затянуть в проект только аннотации, а пользователь сам ими воспользуется, как посчитает нужным? (а можно вообще без аннотаций - руками вызвать конструктор в своем DI не проблема)
источник

НЭ

Некрутов Эдуард... in Android Architecture
Aleksey D.
зачем зависеть от Toothpick, если можно затянуть в проект только аннотации, а пользователь сам ими воспользуется, как посчитает нужным? (а можно вообще без аннотаций - руками вызвать конструктор в своем DI не проблема)
Для того, чтобы восстановить все скоупы и переданные в них данные, нужно хранить и синхронизировать стек этих строителей со стеком фрагмент менеджера. Можно сделать навигатор не зависящий от di, но тогда этот di придется держать отдельной сущностью. На мой взгляд объединить строителя с di модулем, более удобное решение. Проще сделать несколько реализаций под каждую di либу, чем постоянно писать лишний код. Ну и можно сделать универсальную либу, чтобы не зависеть от di и иметь возможность его менять с меньшей болью. Вы часто меняете di?
источник

НЭ

Некрутов Эдуард... in Android Architecture
В readme есть ссылка на чатик для обсуждения. Наверное лучше писать туда, чтобы не спамить тут.
источник

I

Ilnar in Android Architecture
Привет ребята.
Такой вопрос, есть репозиторий

interface TreeRepository {
   fun getTree(): Observable<List<Tree>>
}

Данные идут с сервера и кэшируются в DB. Если есть кэш то репозиторий дает данные из кэша, а если данных нет то лезет в сеть.

Но есть такой кейс: при pulltorefresh, данные в любом случае должнны тянутся с сервера и обновляться в кэше(DB).

Варианты решения:
1) метод getTree репозитория принимает параметр
fun getTree(ignoreCache: Boolean): Observable<List<Tree>>
2) перед выполнением запроса getTree() выполняем очистку кэша clearTree()
3) реализация репозитория инжектится в момент запроса (при каждом запросе создаем объект репозитория, первый может взять из кэша, а второй берет только с сервера и кэширует в DB)
4) ...?



- Если выбрать первый вариант, то возникает вопрос, нормально ли вообще, что клиент знает о наличии кэша и вот таким образом все это разруливает?..
- Если выбрать второй вариант, то кто должен заниматься очисткой? - где этот метод clearTree()? Ну допускаем только вариант, что в репозитории т.к. по другому нет доступа к слою данных. Допустили этот вариант, а что будет есть у нас появится какой то репозиторий который вообще не умеет кэшировать и метод clearTree() никак не реализовать, рузультат выполнения всегда false(условно)?
- Если третий вариант, то вроде бы гуд, или нет?


В итоге, как вы реализуете такой кейс?
источник