Sergii
Всем привет. Не кидайте камнями, может плохо объясняю, кипит голова.
Как и где правильно хранить данные которые я получаю с БД?
Которым классам запрещено иметь ссылку на объект хранилища?
Программа - типо клиент для мессенджера.
Архитектура MVVM
В активности есть RecyclerView, который отображает чат комнаты.
Чат комнаты для RecyclerView загружаются с БД в синглтон класс ChatRoomStorage
А адаптер recyclerView имеет ссылку на ChatRoomStorage.getInstance();
Запускаю программу, активность говорит viewModel.loadChatRooms(); в это время крутится прогресс бар.
viewModel вызывает метод и передаёт в него колбэк, так как будет выполняться работа репозитория в отдельном потоке.
loadData(){
repository.loadChatRooms( o -> {
isSuccess.postValue( (Boolean) o );
} );
}
сам репозиторий в это время подгружает данные и кладёт их в ChatRoomStorage.getInstance().setData(data);
Как видим при срабатывании колбэка - активность получит значение isSuccess, так как подписана на него и потом вызовет adapter.notifyDataSetChanged();
В общем такая тупая херня получилась.
Суть в том, что эти подгрузки с БД нужны для синхронизации данных в случае, скажем, потери соединения с сетью, при восстановлении подключения оно должно подгрузить.
А когда соединение есть то успешно работает веб сокет.
Веб сокет вынесен в service, который по мере поступлений сообщений - должен писать их в хранилище и он же проверяет, если активность привязана к нему то он шлёт бродкаст ей, что бы она вызвала adapter.notifyDataSetChanged(); , а если мертва то сервис делает нотификацию.
И вот сижу как баран и думаю, что почти всюду есть ссылки на хранилище и розосрано взаимодействие с ним. В одном месте в хранилище кладут данные, а совсем в другом вызывают adapter.notifyDataSetChanged();
Помогите советом, пожалуйста.
Посмотри сорсы того же телеграмма.
Николай
Посмотри сорсы того же телеграмма.
Беда в том, что я как бы не имею даже уровня джуна ни в java ни тем более в Android, а Kotlin так вообще не знаю. Я там мало что пойму
Sergii
Да и если нет уровня джуна, не берись за солянку
Sergii
Слишком много фреймворков придется прикручивать, да и одним патерном не обойдешься.
Если уже диплом выбрал... Ну ок.
Sergii
Архитектура пугать будет если проект дальше развивать будешь, если просто сдать, пока не параной
central
С помощью чего обычно делают на андройде авторизация в api?
central
JWT или какие то его разновидности?
Сергѣй
А есть у кого-нибудь туториал под рукой или объяснение как сделать так в android (не в ndk - там то понятно) чтобы пока грузятся ресурсы стоял экран загрузки ( заглушка или как угодно назовите) ? Что-то я как не пытаюсь сделать ( всякие Dialog и setContentView ) он показывает всё только после того как всё (абсолютно всё) загрузит
Sergii
Mike
Сергѣй
Нене, грузит из assets (тут то я ничего менять не хочу - это средствами android микро игра, но когда он к ней подгружает всё я хочу чтобы экран был не чёрный эти… как много 4 секунды ), а он пока всё не загрузит в onSurfaceChanged и в onSurfaceCreated ничего не показывает
Сергѣй
Чёрный экран, а потом уже игра и прочее
Сергѣй
Как можно сделать - открыли приложение и сразу поставили заставку, а всё остальное грузим, как догрузили маякнули и пошла игра - должна же быть такая опция, может кто-то делал такое ?
Сергѣй
И да, не надо давать советы сделать в ndk - у меня тут вся сложность в том, что именно для этой задачи ndk не подходит (и вот я мучаюсь с этим ужасом )
Sergii
Ну перед стартом чтения из асетсов для начала
Sergii
Mike
Сергѣй
Там второй контекст и грузишь, а злесь что не делай он сначала всё грузит, есть примера какого нибудь аналога ?
Sergii
Хотя бы покажи как асетсы грузишь
Сергѣй
ДА какая разница как я их грузу - там несколько шейдеров компилируется и с десяток png картинок грузится
Сергѣй
private fun loadTextureL(name : String) : IntBuffer{
var decoder = PNGDecoder(assetMain.open(name))
var buffer: ByteBuffer = ByteBuffer.allocateDirect(4 * decoder.getWidth() * decoder.getHeight())
decoder.decode(buffer, decoder.getWidth() * 4, PNGDecoder.Format.RGBA)
buffer.flip()
val MyimageID = IntBuffer.allocate(1)
glGenTextures(1, MyimageID)
glBindTexture(GL_TEXTURE_2D, MyimageID[0])
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, decoder.getWidth(), decoder.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer)
glBindTexture(GL_TEXTURE_2D, 0)
return MyimageID
}
Sergii
Ну если пофиг на прогресс
Yergali
Ааа
Сергѣй
И так десять раз
Сергѣй
Sergii
То просто перед началом показываешь прогресс и анимацию линии от 0 до 100 с продолжительностью 4 секунды
Сергѣй
В том, смысле что png ? Тут не принципиально, а как грузить не через ndk astc - я не нашёл, а возиться не хочу ( но да, грузить png и жаловаться на скорость - глупо )
Сергѣй
То просто перед началом показываешь прогресс и анимацию линии от 0 до 100 с продолжительностью 4 секунды
Он не показывает ничего - он это готов показывать только после загрузки всего, вот в чём мой главный вопрос .Как это сделать ( что не выставляй перед загрузкой и прочее) он ничего не показывает почему-то, а только чёрный экран, а когда загрузит, игру - и я progressDialog делал и какие-то решения находил https://gamedev.stackexchange.com/questions/57466/simple-android-loading-screen-when-using-opengl
Но всё не работает
ᛖᚹᛋᛁᚱ
Кто сталкивался с проблемой, когда новый код не пушится студией
ᛖᚹᛋᛁᚱ
Это все ещё старые баги от Instant Run?
ᛖᚹᛋᛁᚱ
Я пол часа убил не понимая почему rv не скроллит вверх программно, а оказалось что студия просто забыла закинуть эту строчку
Sergii
Sergii
Открыть диалог
Сергѣй
Я тоже так подумал и сделал - и ничего не показывает, тут же потом переходишь на onSurfaceCreated - и может оно как-то перебивает
Сергѣй
то есть, логика следующая, мы запускаемся и сначала проверяем и если одно условие- отрываем одно активити ( и там всё нормально), но если другое - идём и грузим игру, а вот игра не показывается пока не загрузит всё… и потому так ужасно
Sergii
Хотя за 4 секунды уже анр должен быть
Сергѣй
анр ? Не понимаю
Sergii
https://developer.android.com/topic/performance/vitals/anr
Sergii
Тут 2 варианта
1 поздно диалог отображает
2 у тебя есть юа поверх диалога (хотя это очень странно)
Посмотри по логам когда шоу отрабатывает, когда стартует приложение или когда ты его фактически видишь на экране
Арсений
Привет, как сделать такое? Через recycler view, какие элементы должны быть?
Kopusha
cardview можешь взять для углов и теней
ᛖᚹᛋᛁᚱ
В целом, ответ да
Kopusha
"да, какие-то элементы должны быть!"
Future Franklin
https://pastebin.com/3sCiVDs1
Future Franklin
Future Franklin
Future Franklin
Вторая активити просто закрывается сразу же при передачи ArrayList'a
Mik
Mik
Замечал что не всегда отрисовывает вьюхи над surface.
Арсений
Mike
private fun loadTextureL(name : String) : IntBuffer{
var decoder = PNGDecoder(assetMain.open(name))
var buffer: ByteBuffer = ByteBuffer.allocateDirect(4 * decoder.getWidth() * decoder.getHeight())
decoder.decode(buffer, decoder.getWidth() * 4, PNGDecoder.Format.RGBA)
buffer.flip()
val MyimageID = IntBuffer.allocate(1)
glGenTextures(1, MyimageID)
glBindTexture(GL_TEXTURE_2D, MyimageID[0])
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, decoder.getWidth(), decoder.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer)
glBindTexture(GL_TEXTURE_2D, 0)
return MyimageID
}
Ты это в onCreate делаешь, не?
Сергѣй
нет, я это делалаю в onSurfaceCreated, но я уже нашёл пример ( сейчас посмотрю как тут и наверное повторю )
Ilya
Драсте. А почему ViewPager может продолжать держать старые интансы фрагментов, когда после поворота экрана я уже новые создаю?
Ilya
Ну при повороте экрана активность же пересоздаётся
Александр
Ваня
Не юзай его на null и всё))
Ваня
Да
Александр
...
Александр
Мб лучше начать с изучения Java Core?
Future Franklin
почитал что нужно как-то индекс передать в другую активити , как сделать?
Future Franklin
ребят?
Maxim
Юзай экстра
Future Franklin
Юзай экстра
Можно пример как индекс передать?
Maxim
https://stackoverflow.com/questions/2091465/how-do-i-pass-data-between-activities-in-android-application
Александр
Можно пример как индекс передать?
https://www.google.com/search?newwindow=1&sxsrf=ALeKk01w5jnTT1apzcChi6O70GEUAK8bxQ%3A1582371365733&ei=JRJRXuCyLO2KmwW55I0Y&q=android+int+from+one+activity+to+another&oq=android+int+from+one+activity+to+another&gs_l=psy-ab.3..33i22i29i30.1013412.1021784..1021880...2.1..0.226.5084.6j33j2......0....1..gws-wiz.....10..0i71j0i67j0j0i131j35i362i39j35i39j0i20i263j0i203j0i22i30.PTkT2Y21cic&ved=0ahUKEwig2aDZiOXnAhVtxaYKHTlyAwMQ4dUDCAs&uact=5
Anonymous
Привет, помогите решить проблему,создал сплеш экран, установил параметры
Для того чтобы спрятать заглавие приложения , а как его вернуть?
Anonymous
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getSupportActionBar().hide();
setContentView(R.layout.activity_home);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
Anonymous
как можно вернуть заглавие приложения?
Anonymous
мне на следующем layout он нужен
Dima
всем привет
кто работал с firebase coud messaging?
почему считает только отправки а всё остальное 0?
Anonymous
И да кто знает простые способы определения местоположения
Roman Kamyshnikov